我有一个PHP脚本(脚本1),该脚本使用AJAX从网站上调用。 该脚本将使用Curl调用服务器上的另一个PHP脚本(脚本2)。然后,该脚本还将使用Curl来运行另一个PHP脚本(脚本3)。
将执行第一个curl调用(执行脚本2)。 但是,脚本3总是会返回超时错误(但脚本3实际上会执行并执行应做的事情)。只是如果脚本2是使用脚本1的curl执行的,则没有响应返回给脚本2。
如果我在Web浏览器中启动脚本2,则将执行脚本3,并将响应返回给脚本2,并且不会发生超时。
所有脚本都在同一服务器上,除了与超时相关的错误外,我在日志中没有收到任何错误消息。
以下代码显示了脚本1如何启动脚本2的多个实例。 这部分工作正常,我已经通过从脚本2中将信息打印到文本文件中进行了检查,并且可以验证脚本2的所有实例都在运行/完成,并且它们都尝试执行脚本3并且都收到相同的超时错误。
foreach ($urls as $url) {
$requests[] = curl_init($url);
curl_setopt($requests[count($requests) - 1], CURLOPT_RETURNTRANSFER, true);
}
$mh = curl_multi_init();
foreach ($requests as $request) {
curl_multi_add_handle($mh, $request);
}
$running = null;
do {
curl_multi_exec($mh, $running);
} while ($running);
$responses = array();
foreach ($requests as $request) {
$responses[] = curl_multi_getcontent($request);
}
foreach ($requests as $request) {
curl_multi_remove_handle($mh, $request);
}
curl_multi_close($mh);
下面的代码块是脚本2执行脚本3的方式,如果我在浏览器中运行脚本2,这将很好地工作,大约需要5秒钟,输出将在浏览器窗口中打印,没有任何错误。
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_PORT, 80);
curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
echo $output;
curl_close($ch);
如果脚本2是从脚本1开始的,则当脚本2尝试运行脚本3时,我将遇到此错误(毫秒数将始终与CURLOPT_TIMEOUT的值匹配)
Operation timed out after 60000 milliseconds with 0 bytes received 03/22/2019 06:13:04 pm