So implementieren Sie gleichzeitige Anforderungen in PHP (Code)
Der Inhalt dieses Artikels befasst sich mit der Implementierung gleichzeitiger Anforderungen (Code) in PHP. Ich hoffe, dass er für Freunde hilfreich ist.
Bei der Entwicklung von Back-End-Diensten gibt es häufig Anforderungen für gleichzeitige Anforderungen. Beispielsweise müssen Sie die Bandbreitendaten von 10 Anbietern abrufen (jeder bietet einen anderen url
) und dann integrierte Daten zurückgeben. Was würden Sie tun?
In PHP
besteht der intuitivste Weg darin, das Ergebnis jeder Anfrage zu foreach
zu durchlaufen urls
und dann zu speichern, wenn die vom Lieferanten bereitgestellte Schnittstelle einen Durchschnitt von 5s
annimmt Die Anforderungszeit dieser Schnittstelle erreicht 50s
, was für Websites, die Geschwindigkeit und Leistung anstreben, nicht akzeptabel ist.
Zu diesem Zeitpunkt benötigen Sie gleichzeitige Anfragen.
PHP
Anfrage
PHP
ist ein Einzelprozess-Synchronisationsmodell. Eine Anfrage entspricht einem Prozess und I/O
wird synchron blockiert. Durch die Erweiterung von Diensten wie nginx/apache/php-fpm
kann PHP Dienste mit hoher Parallelität bereitstellen. Das Prinzip besteht darin, einen Prozesspool aufrechtzuerhalten. Jedes Mal, wenn ein Dienst angefordert wird, wird ein neuer Prozess separat gestartet.
PHP
unterstützt keinen Multithreading-Modus und keine Rückrufverarbeitung, daher PHP
interne Skripte blockieren synchron. Wenn Sie eine 5s
-Anfrage initiieren, wird das Programm I/O
blockieren5s
. Die Codeausführung wird erst fortgesetzt, wenn die Anforderung ein Ergebnis zurückgibt. Daher ist es sehr schwierig, Anforderungsanforderungen mit hoher Parallelität wie Crawler zu erfüllen.
Wie kann man also das Problem gleichzeitiger Anfragen lösen? Zusätzlich zu den integrierten Anforderungsmethoden file_get_contents
und fsockopen
unterstützt PHP
auch die Erweiterung cURL
. Es unterstützt reguläre Einzelanforderungen: PHP-cURL-Anforderungsdetails und gleichzeitige Anforderungen Prinzip ist cURL
Die Erweiterung nutzt Multithreading, um mehrere Anfragen zu verwalten.
PHP
Gleichzeitige Anfrage
Sehen wir uns den Code direkt andemo
:
// 简单demo,默认支持为GET请求 public function multiRequest($urls) { $mh = curl_multi_init(); $urlHandlers = []; $urlData = []; // 初始化多个请求句柄为一个 foreach($urls as $value) { $ch = curl_init(); $url = $value['url']; $url .= strpos($url, '?') ? '&' : '?'; $params = $value['params']; $url .= is_array($params) ? http_build_query($params) : $params; curl_setopt($ch, CURLOPT_URL, $url); // 设置数据通过字符串返回,而不是直接输出 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $urlHandlers[] = $ch; curl_multi_add_handle($mh, $ch); } $active = null; // 检测操作的初始状态是否OK,CURLM_CALL_MULTI_PERFORM为常量值-1 do { // 返回的$active是活跃连接的数量,$mrc是返回值,正常为0,异常为-1 $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); // 如果还有活动的请求,同时操作状态OK,CURLM_OK为常量值0 while ($active && $mrc == CURLM_OK) { // 持续查询状态并不利于处理任务,每50ms检查一次,此时释放CPU,降低机器负载 usleep(50000); // 如果批处理句柄OK,重复检查操作状态直至OK。select返回值异常时为-1,正常为1(因为只有1个批处理句柄) if (curl_multi_select($mh) != -1) { do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); } } // 获取返回结果 foreach($urlHandlers as $index => $ch) { $urlData[$index] = curl_multi_getcontent($ch); // 移除单个curl句柄 curl_multi_remove_handle($mh, $ch); } curl_multi_close($mh); return $urlData; }
Erstellen Sie in dieser gleichzeitigen Anfrage zuerst ein Batch-Handle und dann url
Das cURL
-Handle wird dem Batch-Handle hinzugefügt und der Ausführungsstatus des Batch-Handles wird kontinuierlich abgefragt. Wenn die Ausführung abgeschlossen ist, wird das zurückgegebene Ergebnis erhalten.
curl_multi
Verwandte Funktionen
/** 函数作用:返回一个新cURL批处理句柄 @return resource 成功返回cURL批处理句柄,失败返回false */ resource curl_multi_init ( void ) /** 函数作用:向curl批处理会话中添加单独的curl句柄 @param $mh 由curl_multi_init返回的批处理句柄 @param $ch 由curl_init返回的cURL句柄 @return resource 成功返回cURL批处理句柄,失败返回false */ int curl_multi_add_handle ( resource $mh , resource $ch ) /** 函数作用:运行当前 cURL 句柄的子连接 @param $mh 由curl_multi_init返回的批处理句柄 @param $still_running 一个用来判断操作是否仍在执行的标识的引用 @return 一个定义于 cURL 预定义常量中的 cURL 代码 */ int curl_multi_exec ( resource $mh , int &$still_running ) /** 函数作用:等待所有cURL批处理中的活动连接 @param $mh 由curl_multi_init返回的批处理句柄 @param $timeout 以秒为单位,等待响应的时间 @return 成功时返回描述符集合中描述符的数量。失败时,select失败时返回-1,否则返回超时(从底层的select系统调用). */ int curl_multi_select ( resource $mh [, float $timeout = 1.0 ] ) /** 函数作用:移除cURL批处理句柄资源中的某个句柄资源 说明:从给定的批处理句柄mh中移除ch句柄。当ch句柄被移除以后,仍然可以合法地用curl_exec()执行这个句柄。如果要移除的句柄正在被使用,则这个句柄涉及的所有传输任务会被中止。 @param $mh 由curl_multi_init返回的批处理句柄 @param $ch 由curl_init返回的cURL句柄 @return 成功时返回0,失败时返回CURLM_XXX中的一个 */ int curl_multi_remove_handle ( resource $mh , resource $ch ) /** 函数作用:关闭一组cURL句柄 @param $mh 由curl_multi_init返回的批处理句柄 @return void */ void curl_multi_close ( resource $mh ) /** 函数作用:如果设置了CURLOPT_RETURNTRANSFER,则返回获取的输出的文本流 @param $ch 由curl_init返回的cURL句柄 @return string 如果设置了CURLOPT_RETURNTRANSFER,则返回获取的输出的文本流。 */ string curl_multi_getcontent ( resource $ch )Vordefinierte Konstanten, die in diesem Beispiel verwendet werden:
CURLM_CALL_MULTI_PERFORM: (int) -1
CURLM_OK: (int) 0
PHP
Vergleich des gleichzeitigen Anforderungszeitverbrauchs
Die erste Anfrage verwendet die obige
curl_multi_init
-Methode, und gleichzeitige Anfragen sind105
-mal.Die zweite Anfrage verwendet die traditionelle
foreach
-Methode, und die105
-Zeiten werden mit dercurl_init
-Methodenanforderung durchlaufen.
Das tatsächliche zeitaufwändige Ergebnis der Anfrage ist:
Ohne download
s ca. 765ms
Zeitaufwändig, die Optimierung des reinen Anforderungszeitaufwands hat das 39.83/1.58
- bis 25
-fache erreicht. Wenn wir den Zeitaufwand im Zusammenhang mit dem Verbindungsaufbau weiterhin eliminieren, sollte er noch höher sein. Zeitaufwändig:
Option 1: Die langsamste Schnittstelle erreicht
1.58s
Option 2:
105
Der durchschnittliche Zeitverbrauch der Schnittstelle ist384ms
Hinweise
Parallelitätslimit
curl_multi
verbraucht viele Systemressourcen. Es gibt einen bestimmten Schwellenwert für die Anzahl gleichzeitiger Anfragen, normalerweise 512
, aufgrund von CURL
Internes Limit, das Überschreiten der maximalen Parallelität führt zu einem Fehler.
Zeitüberschreitung
Um zu verhindern, dass langsame Anfragen Auswirkungen haben Sie können den gesamten Dienst festlegenCURLOPT_TIMEOUT
Um die Zeitüberschreitung zu steuern, zu verhindern, dass einige ausgesetzte Anforderungen die Prozessverarbeitung auf unbestimmte Zeit blockieren, und schließlich den Maschinendienst zu beenden.
CPU
Die Last ist voll
Wenn Sie im Codebeispiel weiterhin den gleichzeitigen Ausführungsstatus abfragen, führt dies dazu, dass die Last von cpu
zu hoch ist, also Sie Sie müssen dem Code eine usleep(50000);
-Anweisung hinzufügen.
Gleichzeitig kann curl_multi_select
auch die Belegung von cpu
steuern. Es bleibt in einem Wartezustand, bis eine Antwort auf die Daten erfolgt. Es wird aktiviert und die Ausführung fortgesetzt, sobald neue Daten eingehen , wodurch der unnötige Verbrauch von CPU
reduziert wird.
Verwandte Empfehlungen:
So implementieren Sie AJAX-Warteschlangenanforderungen (mit Code)
Das obige ist der detaillierte Inhalt vonSo implementieren Sie gleichzeitige Anforderungen in PHP (Code). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

PHP -Typ -Eingabeaufforderungen zur Verbesserung der Codequalität und der Lesbarkeit. 1) Tipps zum Skalartyp: Da Php7.0 in den Funktionsparametern wie int, float usw. angegeben werden dürfen. 3) Eingabeaufforderung für Gewerkschaftstyp: Da Php8.0 in Funktionsparametern oder Rückgabetypen angegeben werden dürfen. 4) Nullierstyp Eingabeaufforderung: Ermöglicht die Einbeziehung von Nullwerten und Handlungsfunktionen, die Nullwerte zurückgeben können.

Verwenden Sie in PHP das Klonschlüsselwort, um eine Kopie des Objekts zu erstellen und das Klonierungsverhalten über die \ _ \ _ Clone Magic -Methode anzupassen. 1. Verwenden Sie das Klonschlüsselwort, um eine flache Kopie zu erstellen und die Eigenschaften des Objekts, nicht die Eigenschaften des Objekts zu klonen. 2. Die \ _ \ _ Klonmethode kann verschachtelte Objekte tief kopieren, um flache Kopierprobleme zu vermeiden. 3. achten Sie darauf, dass kreisförmige Referenzen und Leistungsprobleme beim Klonen vermieden werden, und optimieren Sie die Klonierungsvorgänge, um die Effizienz zu verbessern.

PHP eignet sich für Webentwicklungs- und Content -Management -Systeme, und Python eignet sich für Datenwissenschafts-, maschinelles Lernen- und Automatisierungsskripte. 1.PHP hat eine gute Leistung beim Erstellen von schnellen und skalierbaren Websites und Anwendungen und wird üblicherweise in CMS wie WordPress verwendet. 2. Python hat sich in den Bereichen Datenwissenschaft und maschinelles Lernen mit reichen Bibliotheken wie Numpy und TensorFlow übertrifft.

Zu den wichtigsten Spielern in HTTP-Cache-Headern gehören Cache-Control, ETAG und Last-modifiziert. 1.Cache-Control wird verwendet, um die Richtlinien zu kontrollieren. Beispiel: Cache-Control: max-ay = 3600, öffentlich. 2. ETAG überprüft Ressourcenänderungen durch eindeutige Identifikatoren, Beispiel: ETAG: "686897696A7C876B7E". 3. Last-modifiziert gibt die letzte Änderungszeit der Ressource an, Beispiel: Last-Modified: Mi, 21okt201507: 28: 00GMT.

In PHP sollten die Funktionen für Passwort_Hash und passwart_verify verwendet werden, um sicheres Passwort -Hashing zu implementieren, und MD5 oder SHA1 sollte nicht verwendet werden. 1) Passwort_hash generiert einen Hash, der Salzwerte enthält, um die Sicherheit zu verbessern. 2) Passwort_Verify prüfen Sie das Passwort und sicherstellen Sie die Sicherheit, indem Sie die Hash -Werte vergleichen. 3) MD5 und SHA1 sind anfällig und fehlen Salzwerte und sind nicht für die Sicherheit der modernen Passwort geeignet.

PHP ist eine serverseitige Skriptsprache, die für dynamische Webentwicklung und serverseitige Anwendungen verwendet wird. 1.PHP ist eine interpretierte Sprache, die keine Zusammenstellung erfordert und für die schnelle Entwicklung geeignet ist. 2. PHP -Code ist in HTML eingebettet, wodurch es einfach ist, Webseiten zu entwickeln. 3. PHP verarbeitet die serverseitige Logik, generiert die HTML-Ausgabe und unterstützt Benutzerinteraktion und Datenverarbeitung. 4. PHP kann mit der Datenbank interagieren, die Einreichung von Prozessformularen und serverseitige Aufgaben ausführen.

PHP hat das Netzwerk in den letzten Jahrzehnten geprägt und wird weiterhin eine wichtige Rolle bei der Webentwicklung spielen. 1) PHP stammt aus dem Jahr 1994 und ist aufgrund seiner Benutzerfreundlichkeit und der nahtlosen Integration in MySQL die erste Wahl für Entwickler. 2) Zu den Kernfunktionen gehört das Generieren dynamischer Inhalte und die Integration in die Datenbank, sodass die Website in Echtzeit aktualisiert und auf personalisierte Weise angezeigt wird. 3) Die breite Anwendung und das Ökosystem von PHP hat seine langfristigen Auswirkungen angetrieben, steht jedoch auch mit Versionsaktualisierungen und Sicherheitsherausforderungen gegenüber. 4) Leistungsverbesserungen in den letzten Jahren, wie die Veröffentlichung von PHP7, ermöglichen es ihm, mit modernen Sprachen zu konkurrieren. 5) In Zukunft muss PHP sich mit neuen Herausforderungen wie Containerisierung und Microservices befassen, aber seine Flexibilität und die aktive Community machen es anpassungsfähig.

Zu den Kernvorteilen von PHP gehören einfacher Lernen, starke Unterstützung für Webentwicklung, reiche Bibliotheken und Rahmenbedingungen, hohe Leistung und Skalierbarkeit, plattformübergreifende Kompatibilität und Kosteneffizienz. 1) leicht zu erlernen und zu bedienen, geeignet für Anfänger; 2) gute Integration in Webserver und unterstützt mehrere Datenbanken. 3) leistungsstarke Frameworks wie Laravel; 4) hohe Leistung kann durch Optimierung erzielt werden; 5) mehrere Betriebssysteme unterstützen; 6) Open Source, um die Entwicklungskosten zu senken.


Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

SAP NetWeaver Server-Adapter für Eclipse
Integrieren Sie Eclipse mit dem SAP NetWeaver-Anwendungsserver.

Sicherer Prüfungsbrowser
Safe Exam Browser ist eine sichere Browserumgebung für die sichere Teilnahme an Online-Prüfungen. Diese Software verwandelt jeden Computer in einen sicheren Arbeitsplatz. Es kontrolliert den Zugriff auf alle Dienstprogramme und verhindert, dass Schüler nicht autorisierte Ressourcen nutzen.

Herunterladen der Mac-Version des Atom-Editors
Der beliebteste Open-Source-Editor

Dreamweaver CS6
Visuelle Webentwicklungstools

Dreamweaver Mac
Visuelle Webentwicklungstools