现在我正在使用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个脚本。
答案 0 :(得分:3)
<?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);
}
?>
答案 1 :(得分:0)
您可以使用一个队列系统,将您的代码添加到这些URL,将其作为作业和多个工作人员进行CURL调用。
这将使您的代码异步(不等待curl调用的响应)。
您可以使用的优秀PHP库 https://github.com/chrisboulton/php-resque
答案 2 :(得分:0)
<?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 );
?>