Curl ist eines der am häufigsten verwendeten Tools, wenn sie PHP für Datei -Downloads oder Crawling -Netzwerkressourcen verwenden. Im Allgemeinen verwenden wir curl_exec () , um die Anfrage auszuführen und auf die Anforderung zu warten, um synchron abzuschließen. In einigen erweiterten Szenarien müssen Sie beispielsweise beispielsweise die Funktion curl_pause () verwenden.
In diesem Artikel werden die Rolle und Nutzungsszenarien von curl_pause () und der Kombination anderer Curl-Funktionen eingehend eingerichtet, um eine komplexere Download-Kontrolle zu erzielen.
curl_pause () ist eine von libcurl bereitgestellte Funktion zur Steuerung laufender Übertragungsvorgänge, die eine Pause oder Lebenslaufempfang (gelesen) oder senden können (schreiben).
In PHP lautet der Prototyp dieser Funktion wie folgt:
<span><span><span class="hljs-title function_ invoke__">curl_pause</span></span><span>(CurlHandle </span><span><span class="hljs-variable">$handle</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$bitmask</span></span><span>): </span><span><span class="hljs-keyword">int</span></span><span>
</span></span>
Der Parameter $ bitmaske kann eine Kombination der folgenden Konstanten sein:
Curlpause_recv : Pause die Rezeption von Daten
Curlpause_send : Pause Senden von Daten
Curlpause_all : Pause sendet und empfangen
Curlpause_cont : Fortsetzung der Getriebe (Pause veröffentlicht)
Der Rückgabewert ist ein Statuscode vom Typ CurlCode, in der Regel 0 an.
Möglicherweise müssen Sie dynamisch Downloads basierend auf Bandbreite, Benutzeroperationen oder Serverantwort innehalten. Wenn die Bandbreite beispielsweise eng ist, kann eine Download -Aufgabe später angehalten und wieder aufgenommen werden.
<span><span><span class="hljs-variable">$ch</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_init</span></span><span>(</span><span><span class="hljs-string">"https://example.com/largefile.zip"</span></span><span>);
</span><span><span class="hljs-variable">$fp</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">"largefile.zip"</span></span><span>, </span><span><span class="hljs-string">"w"</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_setopt</span></span><span>(</span><span><span class="hljs-variable">$ch</span></span><span>, CURLOPT_FILE, </span><span><span class="hljs-variable">$fp</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_setopt</span></span><span>(</span><span><span class="hljs-variable">$ch</span></span><span>, CURLOPT_WRITEFUNCTION, function(</span><span><span class="hljs-variable">$ch</span></span><span>, </span><span><span class="hljs-variable">$data</span></span><span>) </span><span><span class="hljs-keyword">use</span></span><span> (&$</span><span><span class="hljs-title">paused</span></span><span>) {
</span><span><span class="hljs-title">static</span></span><span> $</span><span><span class="hljs-title">total</span></span><span> = 0;
</span><span><span class="hljs-variable">$len</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>);
</span><span><span class="hljs-variable">$total</span></span><span> += </span><span><span class="hljs-variable">$len</span></span><span>;
</span><span><span class="hljs-comment">// Simulation:Herunterladen zu1MBEinfach innehalten</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$total</span></span><span> >= </span><span><span class="hljs-number">1024</span></span><span> * </span><span><span class="hljs-number">1024</span></span><span> && !</span><span><span class="hljs-variable">$paused</span></span><span>) {
</span><span><span class="hljs-title function_ invoke__">curl_pause</span></span><span>(</span><span><span class="hljs-variable">$ch</span></span><span>, CURLPAUSE_RECV);
</span><span><span class="hljs-variable">$paused</span></span><span> = </span><span><span class="hljs-literal">true</span></span><span>;
}
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$len</span></span><span>;
});
</span><span><span class="hljs-title function_ invoke__">curl_exec</span></span><span>(</span><span><span class="hljs-variable">$ch</span></span><span>);
</span><span><span class="hljs-comment">// Sich später erholen</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$paused</span></span><span>) {
</span><span><span class="hljs-title function_ invoke__">sleep</span></span><span>(</span><span><span class="hljs-number">5</span></span><span>); </span><span><span class="hljs-comment">// Angenommen, wir warten5Zweite</span></span><span>
</span><span><span class="hljs-title function_ invoke__">curl_pause</span></span><span>(</span><span><span class="hljs-variable">$ch</span></span><span>, CURLPAUSE_CONT);
</span><span><span class="hljs-title function_ invoke__">curl_exec</span></span><span>(</span><span><span class="hljs-variable">$ch</span></span><span>);
}
</span><span><span class="hljs-title function_ invoke__">curl_close</span></span><span>(</span><span><span class="hljs-variable">$ch</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$fp</span></span><span>);
</span></span>
curl_pause () ist bei Verwendung von curl_multi_exec () umso wichtiger, um mehrere gleichzeitige Anforderungen zu verarbeiten. Sie können ein griff genau innehalten, ohne andere Anfragen zu beeinflussen.
<span><span><span class="hljs-variable">$mh</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_multi_init</span></span><span>();
</span><span><span class="hljs-variable">$chs</span></span><span> = [];
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$urls</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$url</span></span><span>) {
</span><span><span class="hljs-variable">$ch</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_init</span></span><span>(</span><span><span class="hljs-variable">$url</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_setopt</span></span><span>(</span><span><span class="hljs-variable">$ch</span></span><span>, CURLOPT_RETURNTRANSFER, </span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">curl_multi_add_handle</span></span><span>(</span><span><span class="hljs-variable">$mh</span></span><span>, </span><span><span class="hljs-variable">$ch</span></span><span>);
</span><span><span class="hljs-variable">$chs</span></span><span>[] = </span><span><span class="hljs-variable">$ch</span></span><span>;
}
</span><span><span class="hljs-comment">// Pause eine Anfrage unter bestimmten Bedingungen</span></span><span>
</span><span><span class="hljs-title function_ invoke__">curl_pause</span></span><span>(</span><span><span class="hljs-variable">$chs</span></span><span>[</span><span><span class="hljs-number">0</span></span><span>], CURLPAUSE_RECV);
</span><span><span class="hljs-comment">// Bei der Erholung:</span></span><span>
</span><span><span class="hljs-title function_ invoke__">curl_pause</span></span><span>(</span><span><span class="hljs-variable">$chs</span></span><span>[</span><span><span class="hljs-number">0</span></span><span>], CURLPAUSE_CONT);
</span></span>
Nicht alle Server oder Transporten unterstützen die Pause in der Pause, insbesondere auf Servern ohne Reichweite, die Pause kann einer Unterbrechung entsprechen.
Wenn Sie curlopt_returntransfer verwenden, können Sie Curl_exec () nicht mehr verwenden, um die verbleibenden Daten nach der Pause zu erhalten, und Sie müssen Curl_Multi oder Streaming verwenden.
Die Daten können nach der Pause immer noch im Puffer liegen, sodass Sie möglicherweise immer noch sehen, dass der WriteFunction -Rückruf einmal aufgerufen wird.
curl_pause () bietet PHP eine feinere Granularsteuerung des HTTP-Übertragungsverhaltens, das für erweiterte Szenarien geeignet ist, in denen eine dynamische Steuerung des Datenflusss erforderlich ist, insbesondere in der Datei-Download, Streaming-Medienverarbeitung, Multi-Thread-Aufgabensteuerung usw.
Wenn Sie es verwenden, sollten Sie den WriteFunction -Rückruf und die Curl_Multi -Umgebung kombinieren, um den Übertragungsstatus flexibel zu verwalten. Durch das Beherrschen kann Ihre Netzwerkübertragungslogik beispiellose Flexibilität und Kontrolle erhalten.