Heim  >  Artikel  >  Backend-Entwicklung  >  PHP beschreibt Möglichkeiten zur Verbesserung der Parallelität

PHP beschreibt Möglichkeiten zur Verbesserung der Parallelität

WBOY
WBOYnach vorne
2022-08-18 18:00:011517Durchsuche

Dieser Artikel vermittelt Ihnen relevantes Wissen über PHP. Er stellt vor allem die Lösungen zur Verbesserung der Parallelitätsfähigkeiten von PHP vor, die einen gewissen Referenzwert für das Lernen oder Arbeiten haben Wenn ich es zusammenstelle, hoffe ich, dass es für alle hilfreich sein wird.

(Empfohlenes Tutorial: PHP-Video-Tutorial)

Dieser Artikel enthält die Gitee mit Notizen zum Programmieren. Deckt PHP, JavaScript, Linux, Golang, MySQL, Redis, Open-Source-Tools usw. ab.

PHP, das in Produktionsumgebungen verwendet wird, muss optimiert werden, damit PHP selbst eine bessere Leistung erbringt. Zusätzlich zum Schreiben von PHP-Code müssen Sie auch die Optimierung von php-fpm und php.ini konfigurieren. In diesem Artikel wird die Konfigurationsoptimierung von php.ini unter den Aspekten Speicher, OPcache, Upload, Sitzung und Sicherheit erläutert.

Im Vergleich zu anderen kompilierten Sprachen besteht der größte Nachteil von PHP darin, dass jede Anfrage eine Modulanalyse erfordert und der Arbeitsprozess tatsächlich ausgeführt wird. Der Beginn des Arbeitsprozesses erfordert mehr Ressourcen. Gleichzeitig werden bei jeder Anfrage einige Codes erneut analysiert, was zu einer wiederholten Analyse führt.

Bei der Optimierung von PHP können Sie sich auf diesen Aspekt konzentrieren, um eine Optimierung in Betracht zu ziehen.

Speicheroptimierung

Beim Ausführen von PHP müssen Sie darauf achten, wie viel Speicher jeder PHP-Prozess verwendet. Die Einstellung memory_limit in php.ini wird verwendet, um den maximalen Systemspeicher festzulegen, den ein einzelner PHP-Prozess verwendet verwenden kann. memory_limit设置用于设定单个 PHP 进程可以使用的系统内存最大值。

这个设置的默认值是 128M,这对于大多数中小型 PHP 应用来说或许合适,不过,如果运行的是微型 PHP 应用,可以降低这个值,以便节省系统资源,反之,如果运行的是内存集中型 PHP 应用,可以增加这个值。这个值的大小由可用的系统内存决定,确定给 PHP 分配多少值是一门艺术,决定给 PHP 分配多少内存,以及能负担起多少个 PHP-FPM 进程时,可以根据以下维度信息进行判断:

  • 一共可以分配给 PHP 多少内存?以一个 2G 内存的 VPS 为例,这台设备中可能还运行了其他进程,如 MySQL、Nginx 等,那么留 512M 给 PHP 是合适的。
  • 每个 PHP 进程平均耗费多少内存?这个要监控进程的内存使用量,可以使用命令行命令top,也可以在 PHP 脚本中调用 memory_get_peak_usage()
  • Der Standardwert dieser Einstellung ist 128 MB, was für die meisten kleinen und mittelgroßen PHP-Anwendungen geeignet sein kann. Wenn Sie jedoch eine Mikro-PHP-Anwendung ausführen, können Sie diesen Wert senken, um Systemressourcen zu sparen , wenn Sie einen Speicher für zentralisierte PHP-Anwendungen ausführen, kann dieser Wert erhöht werden. Die Größe dieses Werts wird durch den verfügbaren Systemspeicher bestimmt. Es ist eine Kunst, zu bestimmen, wie viel Speicher PHP zugewiesen werden soll und wie viele PHP-FPM-Prozesse es leisten kann auf den folgenden Dimensionsinformationen:
Wie viel Speicher kann PHP zugewiesen werden? Nehmen Sie als Beispiel einen VPS mit 2G-Speicher. Auf diesem Gerät können auch andere Prozesse wie MySQL, Nginx usw. ausgeführt werden. Daher ist es angebracht, 512 MB für PHP zu belassen.

Wie viel Speicher verbraucht jeder PHP-Prozess im Durchschnitt? Um die Speichernutzung des Prozesses zu überwachen, können Sie den Befehlszeilenbefehl top verwenden oder die Funktion memory_get_peak_usage() in einem PHP-Skript aufrufen, egal welche Methode verwendet wird, führen Sie dasselbe Skript mehrmals aus und ermitteln Sie den Durchschnittsspeicherverbrauch.

Wie viele PHP-FPM-Prozesse können Sie sich leisten? Angenommen, ich ordne PHP 512 MB Speicher zu und jeder PHP-Prozess verbraucht durchschnittlich 15 MB Speicher, dann kann ich mir 34 PHP-FPM-Prozesse leisten.


Sind genügend Systemressourcen vorhanden? Abschließend müssen Sie bestätigen, dass genügend Systemressourcen vorhanden sind, um die PHP-Anwendung auszuführen und den erwarteten Datenverkehr zu verarbeiten. Spezifische PHP-Konfigurationsinformationen finden Sie in der Konfigurationsdatei php-fpm.config.

; Zeitlimit für untergeordnete Prozesse, die auf eine Reaktion auf Signale vom Master warten müssen.
; Verfügbare Einheiten: s(Sekunden), m(Inuten), Stunden(Stunden) oder Tage);
; Standardwert: 0
; Process_control_timeout = 0

; Die maximale Anzahl von Prozessen, die FPM verwenden soll; mit Vorsicht.

; Hinweis: Ein Wert von 0 zeigt an, dass es keine Begrenzung gibt; Standardwert: 0

; Der Wert kann zwischen -19 (höchste Priorität) und 20 (niedrigste Priorität) variieren. Hinweis: - Es funktioniert nur, wenn der FPM-Masterprozess als Root gestartet wird. - Der Poolprozess erbt die Masterprozesspriorität andernfalls angegeben
; Standardwert: no set
;
php-fpm verfügt über drei Betriebsmodi, nämlich eine feste Anzahl von Prozessen, eine Anzahl von On-Demand-Prozessen und eine vollständig dynamische Anzahl von Prozessen.


Die Anzahl der Prozesse wird standardmäßig initialisiert. Wenn die Eingabemenge zu groß ist, werden einige neue Prozesse dynamisch erstellt. Nach Abschluss der Anforderung werden die neu erstellten Prozesse zerstört.

Fixieren Sie die Anzahl der Prozesse. Standardmäßig sind einige Prozesse festgelegt. Wenn die Anzahl der Prozesse nicht ausreicht, warten neue Anfragen und werden nicht verarbeitet, bis die Verarbeitung anderer Prozesse abgeschlossen ist.

Die Anzahl der vollständig dynamischen Prozesse bedeutet, dass sie vollständig von der Anzahl der Anfragen gesteuert werden. Für jede Anfrage wird ein Prozess erstellt und nach der Verarbeitung zerstört.

Aktivieren Sie die Leistungsbeschleunigung von Zend OPcache.

    Nachdem Sie bestimmt haben, wie viel Speicher Sie zuweisen möchten, können Sie die Zend OPcache-Erweiterung von PHP konfigurieren. OPcache analysiert hauptsächlich einige Codes in Bytecode, sodass dieser Teil des Codes in nachfolgenden Anforderungen nicht wiederholt analysiert und kompiliert werden muss. Durch die Reduzierung des Kompilierungs- und Parsing-Prozesses kann auch die Verarbeitungsgeschwindigkeit von PHP verbessert werden.
  • PHP5.5.0+ verfügt über diese integrierte Erweiterung. Hier sind einige notwendige Konfigurationsinformationen:

    opcache.memory_consumption = 64: Der für den Opcode-Cache zugewiesene Speicher (Einheit ist MB), der zugewiesene Speicher Die Menge sollte in der Lage sein, die von allen PHP-Skripten in der Anwendung kompilierten Opcodes zu speichern. Dieser Wert kann je nach Größe der Anwendung auf unterschiedliche Größen eingestellt werden. opcache.memory_consumption = 64:为操作码缓存分配的内存(单位是MB),分配的内存量应该可以保存应用中所有 PHP 脚本编译得到的操作码,这个值根据应用的体量可以设置成不同大小的值。

    opcache.interned_strings_buffer = 16:用来存储驻留字符串的内存量(单位是MB),什么是驻留字符串呢?PHP 解释器在背后会找到相同字符串的多个实例,把这个字符串保存在内存中,如果再次使用相同的字符串,PHP 解释器会使用指针,这么做的目的是节省内存。默认情况下,PHP 驻留字符串会隔离在各个 PHP 进程中,这个设置能让 PHP-FPM 进程池把所有进程驻留字符串存储到共享的缓冲区中,以便在 PHP-FPM 进程池中的多个进程之间引用驻留字符串,这样能节省更多内存。

    opcache.max_accelerated_files = 4000:操作码缓存中最多能存储多少个 PHP 脚本,这个值的区间是 2000 到 100000 之间,这个值一定要比 PHP 应用中的文件数大。

    opcache.validate_timestamps = 1:这个设置的值为1时,经过一段时间后 PHP 会检查 PHP 脚本的内容是否有变化,检查的时间间隔由opcache.revalidate_freq设置指定。如果这个设置的值为0,PHP 不会检查 PHP 脚本的内容是否有变化,我们必须自己动手清除缓存的操作码。建议在开发环境中设置为1,生产环境中设置为0。

    opcache.revalidate_freq = 0:设置多久(单位是秒)检查一次 PHP 脚本内容是否有变化。设置为0秒的含义是仅当opcache.validate_timestamps设置为1时,才会在每次请求时都重新验证 PHP 文件,因此,在开发环境中每次都会重新验证 PHP 文件,在生产环境中则不验证。

    opcache.fast_shutdown = 1:这么设置能让操作码使用更快的停机步骤,把对象析构和内存释放交给 Zend Engine 的内存管理器完成。

    文件上传

    如果你的应用允许上传文件,最好设置最大能上传的文件大小。除此之外,最好还要设置最多能同时上传多少个文件:

    file_uploads = 1
    upload_max_filesize = 10M
    max_file_uploads = 3

    默认情况下,PHP 允许在单次请求中上传 20 个文件,上传的文件最大为 2MB,这里我设置为单次请求最多只能上传 3 个文件,每个文件最大为 10MB,这个值不要设置太大,否则会出现超时。

    注:如果非要上传大文件,Web 服务器的配置也要做相应调整。除了在 php.ini 中设置之外,还要调整 Nginx 虚拟主机配置中的 client_max_body_size 设置。

    此外,如果是上传特大文件,我建议使用Webuploader专门的上传组件,前端对大文件进行切片,后端php对分片数据进行合并还原文件。有关WebUploader应用请参考本站文章:功能强大的文件上传组件-WebUploader。

    执行时间

    max_execution_time 用于设置单个 PHP 进程在终止之前最长可运行时间。这个设置默认是 30 秒,建议将其设置为 5 秒:

    max_execution_time = 5

    在 PHP 脚本中可以调用set_limit_time()

    opcache.interned_strings_buffer = 16: Die Menge an Speicher, die zum Speichern residenter Strings verwendet wird (Einheit ist MB). Hinter den Kulissen findet der PHP-Interpreter mehrere Instanzen derselben Zeichenfolge und speichert die Zeichenfolge im Speicher. Wenn dieselbe Zeichenfolge erneut verwendet wird, verwendet der PHP-Interpreter einen Zeiger. Standardmäßig werden PHP-residente Zeichenfolgen in jedem PHP-Prozess isoliert. Diese Einstellung ermöglicht es dem PHP-FPM-Prozesspool, alle prozessresidenten Zeichenfolgen in einem gemeinsamen Puffer zu speichern, damit sie im PHP-FPM-Prozesspool verarbeitet werden können werden zwischen mehreren Prozessen referenziert, was mehr Speicher spart.

    opcache.max_accelerated_files = 4000: Die maximale Anzahl von PHP-Skripten, die im Opcode-Cache gespeichert werden können. Der Bereich dieses Werts liegt zwischen 2000 und 100000. Dieser Wert muss größer sein als die Anzahl von Dateien in der PHP-Anwendung.

    opcache.validate_timestamps = 1: Wenn der Wert dieser Einstellung 1 ist, prüft PHP nach einer gewissen Zeit, ob sich der Inhalt des PHP-Skripts geändert hat. Das Prüfintervall wird vom Opcache festgelegt .revalidate_freq-Einstellung. Wenn der Wert dieser Einstellung 0 ist, prüft PHP nicht, ob sich der Inhalt des PHP-Skripts geändert hat, und wir müssen die zwischengespeicherten Opcodes selbst löschen. Es wird empfohlen, ihn in der Entwicklungsumgebung auf 1 und in der Produktionsumgebung auf 0 zu setzen.

    opcache.revalidate_freq = 0: Legen Sie fest, wie oft (in Sekunden) überprüft werden soll, ob sich der Inhalt des PHP-Skripts geändert hat. Die Einstellung auf 0 Sekunden bedeutet, dass die PHP-Datei bei jeder Anfrage nur dann erneut validiert wird, wenn opcache.validate_timestamps auf 1 gesetzt ist. In der Entwicklungsumgebung wird die PHP-Datei also jedes Mal erneut validiert, in der jedoch nicht Produktionsumgebung überprüfen.

    opcache.fast_shutdown = 1: Diese Einstellung ermöglicht es dem Opcode, einen schnelleren Shutdown-Schritt zu verwenden, sodass die Objektzerstörung und Speicherfreigabe dem Speichermanager von Zend Engine überlassen werden.

    Datei-Upload

    Wenn Ihre Anwendung das Hochladen von Dateien zulässt, legen Sie am besten die maximale Dateigröße fest, die hochgeladen werden kann. Darüber hinaus ist es am besten, die maximale Anzahl von Dateien festzulegen, die gleichzeitig hochgeladen werden können:

    session.save_handler = "memcached"
    session.save_path = "服务地址:端口号"

    Standardmäßig erlaubt PHP das Hochladen von 20 Dateien in einer einzigen Anfrage, und die maximal hochgeladene Datei beträgt hier 2 MB Legen Sie den Wert auf „Einzeln“ fest. Die Anforderung kann nur bis zu 3 Dateien hochladen, und jede Datei kann bis zu 10 MB groß sein. Stellen Sie diesen Wert nicht zu groß ein, da es sonst zu einer Zeitüberschreitung kommt.

    Hinweis: Wenn Sie große Dateien hochladen müssen, muss die Konfiguration des Webservers entsprechend angepasst werden. Passen Sie zusätzlich zur Einstellung in php.ini die Einstellung client_max_body_size in der Konfiguration des virtuellen Nginx-Hosts an. 🎜🎜Wenn Sie besonders große Dateien hochladen, empfehle ich außerdem die Verwendung der speziellen Upload-Komponente von Webuploader. Das Front-End zerlegt die großen Dateien und das Back-End-PHP führt die fragmentierten Daten zusammen, um die Dateien wiederherzustellen. Informationen zur WebUploader-Anwendung finden Sie im Artikel auf dieser Website: Leistungsstarke Datei-Upload-Komponente – WebUploader. 🎜🎜Ausführungszeit🎜🎜max_execution_time wird verwendet, um die maximale Zeit festzulegen, die ein einzelner PHP-Prozess ausgeführt werden kann, bevor er beendet wird. Diese Einstellung ist standardmäßig auf 30 Sekunden eingestellt und es wird empfohlen, sie auf 5 Sekunden festzulegen: 🎜
    output_buffering = 4096
    implicit_flush = false
    🎜Sie können die Funktion set_limit_time() in einem PHP-Skript aufrufen, um diese Einstellung zu überschreiben. 🎜🎜Angenommen, wir möchten einen Bericht erstellen und die Ergebnisse in eine PDF-Datei umwandeln. Diese Aufgabe kann 10 Minuten dauern, und wir möchten die PHP-Anfrage auf keinen Fall 10 Minuten warten lassen. Wir sollten ein separates PHP schreiben Datei und lassen Sie sie 10 Minuten warten. Durch die Ausführung in einem Hintergrundprozess kann die Webanwendung in nur wenigen Millisekunden einen separaten Hintergrundprozess starten und dann eine HTTP-Antwort zurückgeben. 🎜🎜Tatsächlich verwenden wir bei der Ausführung von Aufgaben, deren Ausführung viel Zeit in Anspruch nimmt, im Allgemeinen Hintergrundprozesse. Beispielsweise können wir die Swoole-Erweiterung von PHP verwenden, um Berichte zu erstellen und E-Mails stapelweise zu versenden, was viel Zeit in Anspruch nimmt. 🎜🎜Verarbeitungssitzungen🎜🎜PHPs Standardsituation besteht darin, die von der Sitzung generierten Informationen auf der Festplatte zu speichern, z. B. die sogenannten Sitzungsinformationen. Beim Erstellen und Lesen einer Sitzung werden E/A-Vorgänge auf der Festplatte ausgeführt. Das Lesen und Schreiben der Festplatte ist tatsächlich ein relativ zeitaufwändiger Vorgang. Und die Sitzung ist für die Verarbeitung des Sitzungsmechanismus verteilter Anwendungen nicht geeignet. Es wird empfohlen, es in einem In-Memory-Dienst wie Redis und Memcached zu platzieren, der über schnelle Lese- und Schreibgeschwindigkeiten verfügt und über einen verteilten Sitzungsmechanismus verarbeitet werden kann. 🎜🎜Das folgende Beispiel speichert Informationen wie die Sitzung im zwischengespeicherten Speicher. 🎜
    open_basedir = /data/www
    🎜Puffer🎜🎜Das Netzwerk wäre effizienter, wenn mehr Daten in weniger Blöcken gesendet würden, anstatt weniger Daten in mehr Blöcken, d. h. in weniger Blöcken, kann die Gesamtzahl reduziert werden von HTTP-Anfragen. 🎜🎜Daher möchten wir, dass PHP die Ausgabepufferung aktiviert, bevor der Inhalt an den Webserver gesendet wird
    output_buffering = 4096
    implicit_flush = false

    如果想要修改输出缓冲区的大小,确保使用的值是4(32位系统)或8(64位系统)的倍数。

    安全设置

    open_basedir:使用open_basedir选项能够控制PHP脚本只能访问指定的目录,这样能够避免PHP脚本访问不应该访问的文件,一定程度上限制了phpshell的危害。我们一般可以设置为只能访问网站目录:

    open_basedir = /data/www

    disable_functions:一般我们要禁止系统函数和禁止任何文件和目录的操作,如:

    disable_functions = '.....'

    expose_php = Off:将此项设置为false即不会再header头输出PHP版本信息。

    display_errors = Off:生产环境中,我们应该禁止错误提示,如果是本地开发环境,可以设置为On。

    log_errors = On:建议在关闭display_errors后能够把错误信息记录下来,便于查找服务器运行的原因。

    error_log:设置PHP错误日志存放的目录。

    (推荐教程:PHP视频教程

Das obige ist der detaillierte Inhalt vonPHP beschreibt Möglichkeiten zur Verbesserung der Parallelität. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:jb51.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen