curl暂停脚本执行
我的脚本使用卷曲通过smugsmug api将图像上传到smugsmug站点。 我通过一个文件夹循环并上传每个图像。但是在3-4次上传之后,curl_exec会失败,停止一切并阻止其他图像上传。curl暂停脚本执行
$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);
不知道是什么问题...什么是失败时的反应如何?系统和apache日志说什么?
现在,如果我是你,我不会在循环中使用curl_init()
和curl_close()
。相反,我会在循环之前初始化,然后在循环之后关闭 - 然后在循环内使用来设置url和不同参数,并且只需拨打curl_exec()
即可。它甚至可能是所有这些处理超出某种系统限制的事情。如果您需要/想要使用多个连接,您可以使用curl_multi
或编写一些管理功能/类来管理多个句柄。
我没有访问Apache日志。它刚刚停止。 – 2010-02-02 17:06:29
@prodigitalson - 我想你的意思是说“...我不会在循环中使用curl_init()和curl_close()。” – GZipp 2010-02-02 17:24:41
@GZipp:是的。纠正。 – prodigitalson 2010-02-02 17:26:19
在我们可以帮忙之前,我们可能需要更多信息,但它听起来像是超时问题。
打开错误报告或检查错误日志以查看是否有任何提示。
尝试设置长卷曲超时与CURLOPT_TIMEOUT
还要检查你的脚本超时足够或set_time_limit()
增加你可以尝试是否输出curl_error()直接作用:
$upload_result = curl_exec($ch); //fails here
$error = curl_error($ch();
if ($error) echo "CURL Error: $error";
curl_close($ch);
如果没有帮助,请检查您的phpinfo();
以查看是否全局关闭了错误报告(查找display_errors
设置)。
当一个人处理多个高延迟请求(例如上传图像)时,CURL包含'multi'(用于多种资源)选项。
参见: 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/
1- Force Curl告诉你更多关于它的功能
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_HEADER, true);
2-如果你是无法在安全模式下,通过把这个在你的脚本的开头确保PHP错误显示:
<?php
ini_set('display_errors', '1');
error_reporting(E_ALL);
3 - 你也可以尝试以CLI模式运行你的脚本。最后,如果你还没有进入安全模式,你可以尝试使用exec()直接运行curl二进制文件。
<?php
$curl_str = "curl -k -o /my/path/curl_output.log -d 'var1=".$value1."&var2=".$value2."& etc...' https://upload.smugmug.com/services/api/rest/1.2.2/";
$r = exec($curl_str);
是否引发了任何错误?也许你的脚本超出了时间限制。 – 2010-02-02 17:03:11
您是否有错误报告和错误显示或记录打开?你有没有使用curl_getinfo()和curl_errmsg()? – GZipp 2010-02-02 17:25:22