Сейчас я использую cURL и что-то вроде этого:
foreach ($urls as $url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url );
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_exec($ch);
}
для запуска сценария php на удаленном сервере.
Мое дело в том, что я просто хочу запустить этот скрипт, и мне все равно, что он возвращает, и я хочу вызвать другой адрес, который находится в моем цикле.
Итак, как я могу устранить ожидание ответа и просто запустить скрипты на серверах (у меня есть около 200 URL-адресов в моем массиве, в котором мне нужно прокручивать и запускать каждый из этих URL-адресов).
Поэтому, в основном, я хочу просто запустить сценарий и перейти к следующему, и все равно, что он возвращает.
И еще одна моя проблема заключается в том, что если я могу переместить curl_init()
вне цикла, вот так:
$ch = curl_init();
foreach ($urls as $url) {
curl_setopt($ch, CURLOPT_URL, $url );
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_exec($ch);
}
Если есть более быстрый способ достижения этого без использования cURL, пожалуйста, дайте мне знать. Мне просто нужно запустить 100 скриптов на удаленных серверах из одного цикла внутри одного файла.
<?php
$fp = fsockopen("mesela.dom", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
$out = "GET / HTTP/1.1\r\n";
$out .= "Host: mesela.dom\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
fclose($fp);
}
?>
foreach ($urls as $url) { }
? Это быстрее, чем cURL? Смогу ли я достичь 100 URL за 10 секунд, используя эту функцию? Нужно ли вообще условие? это может быть как-то урезано, чтобы быстрее выполнить?
<?php
function setcurloptions( $handle=false, $url=false, $cacert=false ){
if( $handle && $url ){
if( parse_url( $url, PHP_URL_SCHEME )=='https' ){
curl_setopt( $handle, CURLOPT_SSL_VERIFYPEER, FALSE );
curl_setopt( $handle, CURLOPT_SSL_VERIFYHOST, 2 );
curl_setopt( $handle, CURLOPT_CAINFO, realpath( $cacert ) );
}
curl_setopt( $handle, CURLOPT_URL, $url );
curl_setopt( $handle, CURLOPT_HEADER, false );
curl_setopt( $handle, CURLOPT_FRESH_CONNECT, true );
curl_setopt( $handle, CURLOPT_FORBID_REUSE, true );
curl_setopt( $handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1 );
curl_setopt( $handle, CURLOPT_CLOSEPOLICY, CURLCLOSEPOLICY_OLDEST );
curl_setopt( $handle, CURLOPT_BINARYTRANSFER, true );
curl_setopt( $handle, CURLOPT_AUTOREFERER, true );
curl_setopt( $handle, CURLOPT_CONNECTTIMEOUT, 30 );
curl_setopt( $handle, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $handle, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT'] );
}
}
$cacert='c:/wwwroot/cacert.pem';
$urls=array(
'http://www.example.com',
'http://www.example.com',
'http://www.example.com'
);
$multi = curl_multi_init();
$handles = array();
foreach( $urls as $i => $url ){
$handle = curl_init();
setcurloptions( $handle, $url, $cacert );
curl_multi_add_handle( $multi, $handle );
$handles[]=$handle;
}
$active=null;
do {
$mrc = curl_multi_exec( $multi, $active );
usleep(100);
} while( $mrc == CURLM_CALL_MULTI_PERFORM );
while( $active && $mrc == CURLM_OK ) {
if( curl_multi_select( $multi ) != -1 ) {
do {
$mrc = curl_multi_exec( $multi, $active );
} while( $mrc == CURLM_CALL_MULTI_PERFORM );
}
usleep( 100 );
}
foreach( $handles as $i => $handle ){
/*
if you want to do something at all with response
$response=curl_multi_getcontent( $handle );
*/
curl_multi_remove_handle( $multi, $handle );
curl_close( $handle );
usleep(100);
}
curl_multi_close( $multi );
?>
$cacert
? Нужно ли это или это что-то из вашего конкретного сценария, и я могу игнорировать это?
Вы можете использовать систему очередей с кодом, добавляя эти URL-адреса, которые будут называться рабочими местами, и несколько сотрудников, выполняющих вызовы CURL.
Это сделает ваш код асинхронным (не дожидаясь ответа от вызова curl).
Хорошая библиотека PHP вы можете использовать https://github.com/chrisboulton/php-resque