3

私のスクリプトは curl を使用して、smugsmug api経由でsmugsmugサイトに画像をアップロードします。フォルダーをループして、そこにあるすべての画像をアップロードします。しかし、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);
4

5 に答える 5

3

何が問題なのかわからない...失敗したときの応答は何ですか? システムと Apache のログは何を示していますか?

今私があなただったら、ループ内でcurl_init()andを使用しません。curl_close()代わりに、ループの前に init し、ループの後に閉じます。次に、ループ内でcurl_set_opt、url と異なるパラメーターを設定し、curl_exec(). これらすべてのハンドルが何らかのシステム制限または何かを超えていることが問題である可能性さえあります。複数の接続を使用する必要がある/使用したい場合は、curl_multi複数のハンドルを管理するためにいくつかの管理関数/クラスを使用または作成できます。

于 2010-02-02T17:03:34.880 に答える
1

お役に立てる前にさらに情報が必要になるかもしれませんが、タイムアウトの問題である可能性があります。

エラー報告を有効にするか、エラー ログをチェックして、何かが発生していないか確認してください。

長いcURLタイムアウトを設定してみてくださいCURLOPT_TIMEOUT

また、スクリプトのタイムアウトが十分であることを確認するか、set_time_limit()

于 2010-02-02T17:18:25.953 に答える
0

1-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);
于 2010-02-11T13:52:56.600 に答える
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/ を参照してください。

于 2010-02-11T08:42:24.633 に答える
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設定を探してください)。

于 2010-02-06T19:59:24.830 に答える