API を介してフィールド値の大規模な更新を実行しようとしましたが、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);
}