Php curl停止脚本执行
我的脚本使用curl通过将图像上传到站点。 我在一个文件夹中循环并上传其中的每个图像。但在3-4次上传后,curl_exec将失败,停止所有操作并阻止其他图像上传Php curl停止脚本执行,php,curl,curl-multi,Php,Curl,Curl Multi,我的脚本使用curl通过将图像上传到站点。 我在一个文件夹中循环并上传其中的每个图像。但在3-4次上传后,curl_exec将失败,停止所有操作并阻止其他图像上传 $upload_array = array( "method" => "smugmug.images.upload", "SessionID" => $session_id, "AlbumID" => $alb_id, "FileName" => zerofill($n, 3)
$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\u init()
和curl\u close()
。相反,我会在循环之前初始化,然后在循环之后关闭-然后在循环itsef中使用curl\u set\u opt
来设置url和不同的参数,只需调用curl\u exec()
。这甚至可能是因为所有这些句柄都超过了某种系统限制之类的问题。如果您需要/想要使用多个连接,您可以使用curl\u multi
或编写一些管理函数/类来管理多个句柄。我们可能需要更多信息才能提供帮助,但听起来可能是超时问题
打开错误报告或检查错误日志,以查看是否引发了任何问题
尝试使用CURLOPT\u timeout
还要检查脚本超时是否足够,或者是否随着
set\u time\u limit()
的增加而增加。您可以尝试直接输出是否有效:
$upload_result = curl_exec($ch); //fails here
$error = curl_error($ch();
if ($error) echo "CURL Error: $error";
curl_close($ch);
如果没有帮助,请检查您的phpinfo()
查看是否全局关闭错误报告(查看显示错误设置)。CURL包括“多”(用于多个资源)选项,用于处理多个高延迟请求(例如上载图像)
见:
以及此处描述的整个“多”函数库:
有关库的多资源部分的完整示例,请参见:
1-强制卷曲,告诉您更多关于它的功能
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_HEADER, true);
2-如果未处于安全模式,请确保PHP在脚本开头显示错误:
<?php
ini_set('display_errors', '1');
error_reporting(E_ALL);
是否出现任何错误?可能您的脚本超出了时间限制。是否已打开错误报告和错误显示或日志记录?您使用过curl\u getinfo()和curl\u errmsg()吗?我没有访问apache日志的权限。它只是停了。@prodigitalson-我想你是想说“…我不会在循环中使用curl\u init()和curl\u close()。@Funky Dude:然后你需要暂时打开显示错误
,看看你是否能从curl获得返回给你的响应内容。没有任何关于其失败原因的信息,我们只是猜测。@prodigitalson:错误显示和报告处于打开状态。它在curl_exec之前显示错误。当它失败时,curl_exec会停止所有操作,而不显示任何内容。
<?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);