我的脚本使用curl通过smugsmug将图片上传到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);
答案 0 :(得分:3)
不确定问题是什么...什么在响应失败时?系统和apache日志说什么?
如果我是你,我不会在循环中使用curl_init()
和curl_close()
。相反,我会在循环之前初始化,然后在循环之后关闭 - 然后在循环之内itsef我会使用curl_set_opt
设置网址和不同的参数,只需调用curl_exec()
。甚至可能是所有这些句柄超出某种系统限制或其他问题。如果您需要/想要使用多个连接,可以使用curl_multi
或编写一些管理函数/类来管理多个句柄。
答案 1 :(得分:1)
在我们提供帮助之前,我们可能需要更多信息,但听起来可能是超时问题。
启用错误报告或检查错误日志以查看是否有任何问题。
尝试使用CURLOPT_TIMEOUT
同时检查脚本超时是否足够,或者使用set_time_limit()
答案 2 :(得分:0)
您可以尝试直接输出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
设置)。
答案 3 :(得分:0)
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/
答案 4 :(得分:0)
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模式运行脚本。
4-最后,如果你不处于安全模式,你可以尝试使用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);