Aktueller Standort: Startseite> Neueste Artikel> Was ist die Handhabungsmethode, wie die Funktion curl_multi_add_handle auf das hochgeladene Upload und Download -Aufgaben angewendet wird?

Was ist die Handhabungsmethode, wie die Funktion curl_multi_add_handle auf das hochgeladene Upload und Download -Aufgaben angewendet wird?

M66 2025-06-22

Was ist die Handhabungsmethode, wie die Funktion curl_multi_add_handle auf das hochgeladene Upload und Download -Aufgaben angewendet wird?

curl_multi_add_handle ist eine der wichtigsten Funktionen in der Curl -Multi -Schnittstelle, wenn mehrere gleichzeitige HTTP -Anforderungen in PHP bearbeitet werden. Es ermöglicht uns, einem einzigen Curl -Handle an eine Multi-Griff-Sitzung zu beitreten, wodurch eine nicht blockierende gleichzeitige Verarbeitung ermöglicht wird. Dieser Mechanismus ist sehr nützlich für das Upload- und Download -Szenarien, in denen große Dateien verarbeitet werden müssen.

1. Verarbeitungsmethode zum Hochladen von Aufgaben in Stücken

Die Grundidee des Block -Uploads besteht darin, eine große Datei in mehrere kleine Stücke zu teilen und diese kleinen Teile gleichzeitig hochzuladen. Die Verwendung von Curl_Multi_Add_handle kann die Upload -Effizienz erheblich verbessern.

Probenfluss:

  1. Teilen Sie große Dateien in mehrere kleine Dateistücke auf (können manuell mit freead () begleitet werden).

  2. Erstellen Sie für jeden Block eine unabhängige Curl -Anforderung (mit der Put- oder Post -Methode).

  3. Fügen Sie diese Anfrage-Handles dem von curl_multi_init () erstellten Multi-Griff-Manager hinzu.

  4. Verwenden Sie curl_multi_exec (), um alle Upload -Anforderungen zu steuern, die gleichzeitig ausgeführt werden sollen.

Einfacher Beispielcode:

 <span><span><span class="hljs-variable">$multiHandle</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_multi_init</span></span><span>();
</span><span><span class="hljs-variable">$chunkFiles</span></span><span> = [</span><span><span class="hljs-string">'chunk1.bin'</span></span><span>, </span><span><span class="hljs-string">'chunk2.bin'</span></span><span>, </span><span><span class="hljs-string">'chunk3.bin'</span></span><span>]; </span><span><span class="hljs-comment">// Beispielblockdatei</span></span><span>
</span><span><span class="hljs-variable">$curlHandles</span></span><span> = [];

</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$chunkFiles</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$index</span></span><span> =&gt; </span><span><span class="hljs-variable">$file</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-string">'https://example.com/upload_chunk'</span></span><span>);
    </span><span><span class="hljs-variable">$fileData</span></span><span> = </span><span><span class="hljs-title function_ invoke__">file_get_contents</span></span><span>(</span><span><span class="hljs-variable">$file</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_setopt</span></span><span>(</span><span><span class="hljs-variable">$ch</span></span><span>, CURLOPT_POSTFIELDS, </span><span><span class="hljs-variable">$fileData</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_HTTPHEADER, [
        </span><span><span class="hljs-string">'Content-Type: application/octet-stream'</span></span><span>,
        </span><span><span class="hljs-string">'Content-Length: '</span></span><span> . </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$fileData</span></span><span>),
        </span><span><span class="hljs-string">'X-Chunk-Index: '</span></span><span> . </span><span><span class="hljs-variable">$index</span></span><span>
    ]);

    </span><span><span class="hljs-title function_ invoke__">curl_multi_add_handle</span></span><span>(</span><span><span class="hljs-variable">$multiHandle</span></span><span>, </span><span><span class="hljs-variable">$ch</span></span><span>);
    </span><span><span class="hljs-variable">$curlHandles</span></span><span>[] = </span><span><span class="hljs-variable">$ch</span></span><span>;
}

</span><span><span class="hljs-comment">// Führen Sie alle Upload -Aufgaben aus</span></span><span>
</span><span><span class="hljs-variable">$running</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>;
</span><span><span class="hljs-keyword">do</span></span><span> {
    </span><span><span class="hljs-title function_ invoke__">curl_multi_exec</span></span><span>(</span><span><span class="hljs-variable">$multiHandle</span></span><span>, </span><span><span class="hljs-variable">$running</span></span><span>);
    </span><span><span class="hljs-title function_ invoke__">curl_multi_select</span></span><span>(</span><span><span class="hljs-variable">$multiHandle</span></span><span>);
} </span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$running</span></span><span> &gt; </span><span><span class="hljs-number">0</span></span><span>);

</span><span><span class="hljs-comment">// Ressourcen aufräumen</span></span><span>
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$curlHandles</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$ch</span></span><span>) {
    </span><span><span class="hljs-title function_ invoke__">curl_multi_remove_handle</span></span><span>(</span><span><span class="hljs-variable">$multiHandle</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__">curl_multi_close</span></span><span>(</span><span><span class="hljs-variable">$multiHandle</span></span><span>);
</span></span>

2. So behandeln Sie Block -Download -Aufgaben

Für Block -Downloads gilt der gleiche Mechanismus. Durch das Festlegen des Bereichs Header können wir ein bestimmtes Byte -Intervall der Datei anfordern, wodurch verschiedene Teile der gesamten Datei gleichzeitig heruntergeladen und dann diese Teile zusammengeführt werden.

Schritt Beschreibung:

  1. Ruft die Gesamtgröße der Zieldatei ab.

  2. Teilen Sie es in mehrere Segmente auf, zum Beispiel 1 MB per Segment.

  3. Erstellen Sie für jedes Segment eine Curl -Anforderung mit Range Header.

  4. Verwenden Sie CURL_MULTI_ADD_HANDLE , um eine Mehrfach-Griff-Sitzung für den gleichzeitigen Download hinzuzufügen.

  5. Fucken Sie die Downloadergebnisse in der Reihenfolge zusammen.

Kurzer Codebeispiel:

 <span><span><span class="hljs-variable">$url</span></span><span> = </span><span><span class="hljs-string">'https://example.com/largefile.zip'</span></span><span>;
</span><span><span class="hljs-variable">$fileSize</span></span><span> = </span><span><span class="hljs-number">10000000</span></span><span>; </span><span><span class="hljs-comment">// Angenommen, die Dateigröße ist10MB</span></span><span>
</span><span><span class="hljs-variable">$chunkSize</span></span><span> = </span><span><span class="hljs-number">1000000</span></span><span>;  </span><span><span class="hljs-comment">// Jedes Stück1MB</span></span><span>
</span><span><span class="hljs-variable">$multiHandle</span></span><span> = </span><span><span class="hljs-title function_ invoke__">curl_multi_init</span></span><span>();
</span><span><span class="hljs-variable">$curlHandles</span></span><span> = [];
</span><span><span class="hljs-variable">$results</span></span><span> = [];

</span><span><span class="hljs-keyword">for</span></span><span> (</span><span><span class="hljs-variable">$start</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>; </span><span><span class="hljs-variable">$start</span></span><span> &lt; </span><span><span class="hljs-variable">$fileSize</span></span><span>; </span><span><span class="hljs-variable">$start</span></span><span> += </span><span><span class="hljs-variable">$chunkSize</span></span><span>) {
    </span><span><span class="hljs-variable">$end</span></span><span> = </span><span><span class="hljs-title function_ invoke__">min</span></span><span>(</span><span><span class="hljs-variable">$start</span></span><span> + </span><span><span class="hljs-variable">$chunkSize</span></span><span> - </span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-variable">$fileSize</span></span><span> - </span><span><span class="hljs-number">1</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_setopt</span></span><span>(</span><span><span class="hljs-variable">$ch</span></span><span>, CURLOPT_RANGE, </span><span><span class="hljs-string">"<span class="hljs-subst">$start</span></span></span><span>-</span><span><span class="hljs-subst">$end</span></span><span>");

    </span><span><span class="hljs-title function_ invoke__">curl_multi_add_handle</span></span><span>(</span><span><span class="hljs-variable">$multiHandle</span></span><span>, </span><span><span class="hljs-variable">$ch</span></span><span>);
    </span><span><span class="hljs-variable">$curlHandles</span></span><span>[] = </span><span><span class="hljs-variable">$ch</span></span><span>;
}

</span><span><span class="hljs-comment">// Führen Sie alle Download -Aufgaben aus</span></span><span>
</span><span><span class="hljs-variable">$running</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>;
</span><span><span class="hljs-keyword">do</span></span><span> {
    </span><span><span class="hljs-title function_ invoke__">curl_multi_exec</span></span><span>(</span><span><span class="hljs-variable">$multiHandle</span></span><span>, </span><span><span class="hljs-variable">$running</span></span><span>);
    </span><span><span class="hljs-title function_ invoke__">curl_multi_select</span></span><span>(</span><span><span class="hljs-variable">$multiHandle</span></span><span>);
} </span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$running</span></span><span> &gt; </span><span><span class="hljs-number">0</span></span><span>);

</span><span><span class="hljs-comment">// Ergebnisse sammeln und verschmelzen</span></span><span>
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$curlHandles</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$ch</span></span><span>) {
    </span><span><span class="hljs-variable">$results</span></span><span>[] = </span><span><span class="hljs-title function_ invoke__">curl_multi_getcontent</span></span><span>(</span><span><span class="hljs-variable">$ch</span></span><span>);
    </span><span><span class="hljs-title function_ invoke__">curl_multi_remove_handle</span></span><span>(</span><span><span class="hljs-variable">$multiHandle</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__">curl_multi_close</span></span><span>(</span><span><span class="hljs-variable">$multiHandle</span></span><span>);

</span><span><span class="hljs-comment">// Schreiben Sie in die vollständige Datei</span></span><span>
</span><span><span class="hljs-title function_ invoke__">file_put_contents</span></span><span>(</span><span><span class="hljs-string">'merged_file.zip'</span></span><span>, </span><span><span class="hljs-title function_ invoke__">implode</span></span><span>(</span><span><span class="hljs-string">''</span></span><span>, </span><span><span class="hljs-variable">$results</span></span><span>));
</span></span>

3.. Dinge zu beachten

  1. Einschränkung der Verbindungen : Zu viel Parallelität kann dazu führen, dass der Server Verbindungen ablehnt. Es wird empfohlen, die Anzahl der Parallelität zu steuern (z. B. 5 Verarbeitung jedes Mal).

  2. Fehlerbehandlung : Verwenden Sie curl_error () und curl_multi_info_read (), um den Status jeder Anforderung zu überprüfen.

  3. Timeout -Einstellung : Es wird empfohlen, Curlopt_Timeout festzulegen, um zu verhindern, dass einzelne Anforderungen im gesamten Prozess stecken bleiben.

Zusammenfassen

CURL_MULTI_ADD_HANDLE ist eines der Kernwerkzeuge für die Erstellung gleichzeitiger HTTP -Anforderungen. Durch die Kombination von Chunking -Strategien können Aufgaben großer Dateien effizient behandelt und heruntergeladen werden. Eine angemessene Organisation von Anfragen, gleichzeitiger Kontrolle und Fehlerbehandlung sind wichtige Faktoren, die in praktischen Anwendungen berücksichtigt werden müssen. Es kann die Leistung und Zuverlässigkeit der PHP -Netzwerkkommunikation erheblich verbessern.