3

API を介してフィールド値の大規模な更新を実行しようとしましたが、PHP スクリプトの最大実行時間に達しました。

ジョブを小さなタスクに分割して、小さなジョブとして非同期で実行しました...

非同期 PHP 呼び出し?

私はこの投稿を見つけました、それはほぼ正しいように見えますが、コメントは少し不快です... curlを使用して外部スクリプトファイルを実行すると、呼び出し元ファイルが最大実行時間をトリガーするのを防ぐことができますか、それともcurlはサーバーからの応答を待ち続けますか?私のページを殺す?

問題は、PHP で非同期ジョブをどのように行うかということです。アヤックスのようなもの。

編集::///

多くのデータ行を持つプロジェクト管理ツールがあります。このツール API を使用してデータ行にアクセスし、ページに表示しています。私のツールを使用しているユーザーは、チェックボックスで複数のデータ行を選択し、ボックスに新しい値を入力します。ユーザーは、更新スクリプトを実行する「行の値の更新」ボタンを押します。

この更新スクリプトは、選択された可能性のある数百または数千のアイテムを 100 のグループに分割します。

この時点で、非同期メソッドを使用してプロジェクト管理ツールに接続し、100 項目すべてを更新するつもりでした。

それらのアイテムを更新するとき、そのサーバーがそのプロセスを実行するのに長い時間がかかる可能性があるため、それらのジョブを分割する元のページがその操作からの要求を待機していないことを確認して、さらに起動できるようにする必要があります。アイテムの更新リクエスト。サーバーページがユーザーに「わかりました。現在更新が行われています。しばらく時間がかかる場合があります。完了したらメールを送信します」と言うことができます。

    $step = 100;
    $itemCount = GetItemCountByAppId( $appId );
    $loopsRequired = $itemCount / $step;            
    $loopsRequired = ceil( $loopsRequired );

    $process = array();

    for( $a = 0; $a < $loopsRequired; $a++ )
    {
        $items = GetItemsByAppId( $appId, array( 
            "amount" => $step, 
            "offset" => ( $step *  $a ) 
        ) );  

        foreach( $items[ "items" ] as $key => $item )
        {
            foreach( $fieldsGroup as $fieldId => $fieldValues )
            {
                $itemId = $item->__attributes[ "item_id" ];
                /*array_push( $process, array(
                    "itemId" => $itemId,
                    "fieldId" => $fieldId,
                ) );*/
                UpdateFieldValue( $itemId, $fieldId, $fieldValues );
                // This Update function is actually calling the server and I assume it must be waiting for a response... thus my code times out after 30 secs of execution
            }
        }  

        //curl_post_async($url, $params);
    }
4

2 に答える 2

0

実装方法によっては、非同期 PHP を使用して Web 要求を処理から切り離し、処理中のタイムアウトから Web 要求を分離することができます (ただし、単一のスレッド内で同じことを行うこともできます)。タスクをより小さな並行部分に分割すると、実行速度が向上しますか? おそらくそうではありません-通常、これによりジョブの完了にかかる時間が長くなります-これが当てはまらないのは、非常に大きな処理能力があり、タスクを効果的に分散できる場合のみです(例:map-reduce )。HTTP 呼び出し (curl) は、このように作業を分散する効率的な方法ですか? いいえ。同期および非同期メッセージング、バッチ処理、プロセス フォーク、スレッドなど、他の方法もあります。それぞれに利点と複雑さがありますが、私たちにはありません。

したがって、具体的な質問に答える前であっても、これは良い戦略とは思えません。

curl を使用して外部スクリプト ファイルを実行すると、呼び出し元ファイルが最大実行時間をトリガーするのを防ぐことができますか

ターゲットサーバーで構成されているタイムアウトによって制限されます-それが呼び出しスクリプトと同じサーバーである場合、同じタイムアウトになります。

カールはサーバーからの応答を待ってページを強制終了しますか?

ここで何を尋ねているのかわかりません。むしろ、あなたが私たちに話していない機能的な依存関係があることを意味しています。

解決策を選択し、それを問題に合わせようとしているようです。

于 2013-05-20T11:41:38.037 に答える