0

これらのファイルを含むPHPアプリケーションがあります:landing.php、redirect.php、ajax.php

landing.phpへのページ呼び出しで、特定のデータをキャプチャするためにjavascriptコードを実行し、それらをDBに挿入するajax.phpにAJAXPOSTを発行します。最後に、php header()はredirect.phpにリダイレクトします

現在、上記の機能は出力バッファリングを使用していますが、header()の実行が早すぎて、AJAX POSTが終了していません。つまり、DBクエリは実行されません。

header ()の前にsleep() usleep()を使用しようとしましたが、機能しません。私は出力バッファリングにあまり詳しくないので、親切な手を差し伸べていただけませんか。

ありがとうございました。

<?php ob_start(); ?>

<scripts type="text/javascript">
var data = 'blah..blah..blah..';
ajaxPost('ajax.php', data);
</scripts>

<?php
sleep(2);    // <---- I want the script to sleep here and wait for the AJAX to finish
header('c.php)
ob_end_flush();
?>
4

1 に答える 1

3

私があなたを正しく理解していれば、あなたはWebアプリケーションがどのように機能するかについて根本的な誤解を持っています。

スクリプト全体が最初にサーバーで実行され、出力(AJAX呼び出しの一部)がブラウザーに送信されるため、PHPスクリプトはAJAXビットの実行を待つことができません。あなたはこれをしている方法を再考しなければなりません。

たとえば、JavaScriptで最初にAJAX呼び出しを行い、次にブラウザをリダイレクトすることができます。

編集:OK、これについてもう少し考えたので、出力バッファリングを使用していないときに、ブラウザがスクリプトを表示するとすぐにスクリプトを実行すると、このようなものがどのように機能するかを確認できます(全ページが読み込まれます)。それが実際に当てはまる場合でも、ブラウザのタイミング、ユーザーのインターネット接続の品質などに依存して、同期を維持しています。それは明らかに良いことではありません

ただし、機能する唯一の方法は、ヘッダー呼び出しの前にAJAX呼び出しがブラウザーに出力された場合です。これは不可能です。HTTP応答のコンテンツの前にヘッダーを送信する必要があるため(そもそも出力バッファリングを使用している理由です)、JavaScriptを出力しないか、ヘッダー呼び出しが失敗します。ですから、アプローチを再考することをお勧めします。

于 2009-08-03T09:35:37.113 に答える