curl 停止脚本执行
我的脚本使用curl通过smugsmug网站上传图像.net/display/API/show+1.2.2?method=smugmug.images.upload" rel="nofollow noreferrer">smugsmug api。 我循环浏览一个文件夹并上传其中的每个图像。但在上传 3-4 次后,curl_exec 将失败,停止一切并阻止其他图像上传。
$upload_array = array(
"method" => "smugmug.images.upload",
"SessionID" => $session_id,
"AlbumID" => $alb_id,
"FileName" => zerofill($n, 3) . ".jpg",
"Data" => base64_encode($data),
"ByteCount" => strlen($data),
"MD5Sum" => $data_md5);
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_POSTFIELDS, $upload_array);
curl_setopt(
$ch, CURLOPT_URL,
"https://upload.smugmug.com/services/api/rest/1.2.2/");
$upload_result = curl_exec($ch); //fails here
curl_close($ch);
更新: 所以我添加了登录到我的脚本中。当它失败时,日志记录会在 fwrite($fh, "begin curl\n"); 之后
fwrite($fh, "begin curl\n");
$upload_result = curl_exec($ch);
fwrite($fh, "curl executed\n");
fwrite($fh, "curl info: ".print_r(curl_getinfo($ch,true))."\n");
fwrite($fh, "xml dump: $upload_result \n");
fwrite($fh, "curl error: ".curl_error($ch)."\n");
停止
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60*60);
my script uses curl to upload images to smugsmug site via smugsmug api.
i loop through a folder and upload every image in there. but after 3-4 uploads, curl_exec would fail, stopped everything and prevent other images from uploading.
$upload_array = array(
"method" => "smugmug.images.upload",
"SessionID" => $session_id,
"AlbumID" => $alb_id,
"FileName" => zerofill($n, 3) . ".jpg",
"Data" => base64_encode($data),
"ByteCount" => strlen($data),
"MD5Sum" => $data_md5);
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_POSTFIELDS, $upload_array);
curl_setopt(
$ch, CURLOPT_URL,
"https://upload.smugmug.com/services/api/rest/1.2.2/");
$upload_result = curl_exec($ch); //fails here
curl_close($ch);
updated:
so i added logging into my script. when it does fail, the logging stops after fwrite($fh, "begin curl\n");
fwrite($fh, "begin curl\n");
$upload_result = curl_exec($ch);
fwrite($fh, "curl executed\n");
fwrite($fh, "curl info: ".print_r(curl_getinfo($ch,true))."\n");
fwrite($fh, "xml dump: $upload_result \n");
fwrite($fh, "curl error: ".curl_error($ch)."\n");
i also
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60*60);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
不确定问题是什么...失败时的响应是什么?系统和apache日志说什么?
现在,如果我是你,我不会在循环中使用
curl_init()
和curl_close()
。相反,我会在循环之前初始化,并在循环之后关闭 - 然后在循环内部,我将使用curl_set_opt来设置url和不同的参数,然后调用curl_exec() 。甚至可能是所有这些句柄超出了某种系统限制或其他原因。如果您需要/想要使用多个连接,您可以使用curl_multi
或编写一些管理函数/类来管理多个句柄。Not sure what the issue is... What is in the response when it fails? What do the system and apache logs say?
Now if i were you i wouldnt use
curl_init()
andcurl_close()
in the loop. instead i would init before the loop, and close after the loop - then within the loop itsef i would usecurl_set_opt
to set the url and differing parameters and just callcurl_exec()
. It may even be its a matter of all these handles exceeding some kind of system limit or something. If you need/want to use multiple connections you could usecurl_multi
or write some management functions/class to manage multiple handles.我们可能需要更多信息才能提供帮助,但这听起来可能是超时问题。
打开错误报告或检查错误日志以查看是否出现任何问题。
尝试使用
CURLOPT_TIMEOUT
设置较长的 cURL 超时同时检查脚本超时是否足够或使用
set_time_limit()
增加We may need more info before we can help, but it sounds like it could be a timeout issue.
Turn on error reporting or check your error logs to see if anything is being raised.
Try setting a long cURL timeout with
CURLOPT_TIMEOUT
Also check that your script timeout is sufficient or increase with
set_time_limit()
1- 强制 Curl 告诉您更多有关其功能的信息
2- 如果您未处于安全模式,请通过将其放在脚本的开头来确保 PHP 显示错误:
3- 您还可以尝试在以下位置运行脚本CLI 模式。
4-最后,如果您未处于安全模式,您可以尝试使用 exec() 直接运行curl 二进制文件。
1- Force Curl to tell you a bit more about what it does
2- If you are not in safe mode, make sure PHP displays errors by putting this at the beginning of your script:
3- You can also try to run your script in CLI mode.
4- Finally, still if you are not in safe mode, you can try to directly run the curl binary using exec().
当处理多个高延迟请求(例如上传图像)时,CURL 包含“多”(针对多个资源)选项。
看:
http://www.php.net/manual/en/ function.curl-multi-exec.php
以及此处描述的整个“多重”功能库:
http://php.net/manual/en/book.curl.php
有关库的多资源部分的完整示例,请参阅:
http://www .developertutorials.com/blog/php/parallel-web-scraping-in-php-curl-multi-functions-375/
CURL includes the 'multi' (for multiple-resources) options for when one is dealing with multiple high-latency requests (such as uploading images).
See:
http://www.php.net/manual/en/function.curl-multi-exec.php
and the entire library of 'multi' functions described here:
http://php.net/manual/en/book.curl.php
For a complete example of the multiple resource section of the library, see:
http://www.developertutorials.com/blog/php/parallel-web-scraping-in-php-curl-multi-functions-375/
您可以尝试直接输出 curl_error() 是否有效:
如果不行如果没有帮助,请检查您的
phpinfo();
以查看错误报告是否已全局关闭(查找display_errors
设置)。You could try whether outputting curl_error() directly works:
If that doesn't help, check your
phpinfo();
to see whether error reporting is turned off globally (look for thedisplay_errors
setting).我在下面使用这个 ajax 来调用 ajax.php 文件中的函数
下面是 ajax.php -> action=save_parcel' 从上面调用
ajax:
然后从上面调用 admin.php(save_parcel) 函数:
注释:
上面是发送一条短信,效果很好,但是应用程序
光标保持无限循环旋转而不是转到
location.href = 'index.php?page=parcel_list' 如上所示。
I am using this ajax here below to call a function inside ajax.php file
Below is the ajax.php -> action=save_parcel' being called from above
ajax:
Then from above, calls admin.php(save_parcel)function:
Notes:
Above is sending an sms message which it does fine but the application
cursor keeps rotating in an indefinite loop instead of going to
location.href = 'index.php?page=parcel_list' as indicated above.