2

ユーザー入力(テキストとリンク)を取得し、それをデータベースに入れ、ユーザーが提供したリンクを使用して画像を検索するphpスクリプトがあります。

問題は、画像の検索に時間がかかる場合があり、これにより Web サイトが「スタック」し、「投稿が送信されました!」というビューが表示されることです。最終的にロードするのに 4 ~ 6 秒かかることがあります。

PHP で画像を非同期的に検索する方法はありますか?

ビューを読み込んでから画像検索を実行したり、AJAX を使用したりしないのはなぜかと思うかもしれません。さて、アイテム ID に従って画像の名前を変更するには、データベースからの「最後の挿入 ID」が必要です。これは、投稿がデータベースに挿入された後にのみ実行できます。

編集 1:私はすでにこの非同期 PHP 呼び出しを読みましたか? しかし、私が理解しているかどうかはわかりません。

編集 2:要求されたプロセスの概要は次のとおりです。

  • ステップ 1: ユーザーがフォームを開き、2 つのフィールド (テキストとリンク) に入力します。
  • ステップ 2: ユーザーがフォームを送信する
  • ステップ 3: PHP は MySQL データベースに投稿を挿入します
  • ステップ 4: PHP はそのリンクの画像を検索し (Web をクロールします。数秒かかります)、データベースに挿入された最後の ID の名前で画像を保存します。最後の ID が 75 の場合、画像は「img_75」として保存されます。
  • ステップ 5: PHP が「リンクの投稿に成功しました」を読み込みます

私が望むのは、ステップ 5 がステップ 3 の直後に発生し、ステップ 4 が実行されていることです。ステップ 4 からの応答は実際には必要ありません。バックグラウンドで実行される限り、私は満足しています :)


解決策: @shadyyx が提案することを実行しました。シンプルな AJAX 呼び出し。私は代替手段を本当に望んでいましたが、どうやらphpも他のサーバー側言語も非同期呼び出しを処理できません。

4

5 に答える 5

4

これは、2ステップのAJAX呼び出しで行います。

これがどのように見えるべきかです:

  1. ユーザーがフォームを開き、データを入力します
  2. ユーザーが送信ボタンをクリックします-AJAX呼び出しがサーバーに送信されます
  3. 新しいエントリがデータベースに書き込まれ、最後のIDが応答としてJSに返されます
  4. フォームが送信されたというメッセージをユーザーに表示します
  5. 目的のURLをクロールする新しいAJAXリクエストを呼び出し、最初のAJAXレスポンスから取得したIDで画像をダウンロードして保存します...

クリア?簡単?私はそれだと思います...

于 2012-05-22T13:46:54.250 に答える
1

これにはプロセスを使用しました。

  1. クライアントが要求する
  2. サーバーが応答し、クライアントに応答 ID を与える
  3. サーバーは、バックグラウンドで実行時間の長い処理を行う php プロセスを開始し、結果をファイルに保存します。
  4. クライアントは数秒ごとに ID を含む回答を要求します
  5. すべてがファイルにある場合、サーバーはそれをロードし、サーバーの応答要求で結果を送信します。

これには popen() を使用しました...

また、サーバーは、クライアントが応答を要求するまで待機する必要がある期間をクライアントに伝えることができます。

于 2012-05-22T13:20:08.140 に答える
1

あなたのケースに私が提案するのは次のとおりです。

  • フォーム ページが読み込まれているときに、ブラウザに Cookie を送信します。
  • 画像のリクエストは、挿入される「予定」のレコードに依存してはなりません (また、依存してはなりません)。
  • 検索している画像は、一時的なパスに保存されます。そのパスを Cookie に関連付けます。PHP では、$_SESSION[...]. これは、ユーザーが必須フィールドに入力するとすぐに AJAX 要求になります。
  • フォームがサーバーに送信されると:
  • サーバーは $_SESSION 変数からイメージを取得します。
  • PHP はファイルを一時的な場所から実際の場所に移動します。
  • DBを更新します。

時期尚早にレコードを作成してはいけない理由

AJAX リクエストがサーバーにヒットし (そしてレコードが作成され)、ユーザーが別の場所に移動するとどうなりますか? そのような場合、そのレコードを削除するための追加の構造が必要になります。これは、入りたくない余分なものです。

于 2012-05-22T13:40:56.337 に答える
1

新しいレコードを作成し、最後の ID をすぐに返し、新しいクエリを実行してレコードを情報で更新してみませんか?

于 2012-05-22T13:27:31.693 に答える
0

この非同期 PHP 呼び出しを既に読んだことがありますか?

そこでの回答の質は向上する可能性があります。

しかし、私が理解しているかどうかはわかりません

えっと、ここでの答えが理解できないかもしれません。

簡単に言えば、非同期の PHP コードを書くことはできないということです。

より長い答えは、curl_multi_ 関数を使用して PHP から並列 HTTP 要求を行うことができる (ただし、まだブロックしている) ということです。ただし、ブロックせずに PHP からページを生成する場合は、AJAX 呼び出しを含む HTML を生成し、ブラウザーを許可する必要があります。同時リクエストを処理し、完了時にページに移入します。このアプローチを使用すると、DBMS で複数の検索スレッドを呼び出すオプションがあり、(正しく行われた場合) 単一の要求よりも高速に実行されます。

于 2012-05-22T14:36:13.240 に答える