問題タブ [curl-multi]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
1226 参照

php - サーバー間のランダムな接続の問題を引き起こすPHP cURLマルチハンドリング?

オンライン ゲームの個々のプレーヤーのデータを追跡する Web サイトがあります。毎日同時に、cURL を使用してゲーム会社のサーバーから各プレイヤーのデータをフェッチする cron が実行されます (各プレイヤーは、フェッチするために独自のページを必要とします)。以前は、各プレーヤーをループして、一度に独自の cURL リクエストを作成し、データを保存していました。これは遅いプロセスでしたが、数週間はすべて正常に機能していました (毎日 500 から 1,000 プレーヤーのどこかで実行していました)。

プレイヤーが増えるにつれ、cron の実行に時間がかかりすぎたので、約 1 週間前にParallelCurl (cURL マルチ ハンドリング) を使用して書き直しました。一度に開く接続数は 10 以下に設定されており、完璧に動作していました。3 ~ 4 分で約 3,000 ページを処理していました。1 日か 2 日後、ランダムにサーバーに接続できなくなる (http コード 0 を返す) まで、何か問題があることに気づきませんでした。約1〜2時間後に突然再び接続できるようになるまで、私は永久に禁止/ブロックされたと思っていました. ブロックは、その日の cron が実行されてから数時間後に発生しました。その時点で行われていた唯一のリクエストは、時折行われていた単一のファイル リクエストでした (正常に機能し、何ヶ月も放置されていました)。

ここ数日はみんなこんな感じです。Cron は正常に動作しますが、その後 (数時間) 1 時間か 2 時間接続できません。今日、一度に 5 つの接続のみを開くように cron を更新しました。

私は大量のグーグル検索を行ってきましたが、有用なものが見つからないようです。おそらくファイアウォールが私の接続をブロックしていると思いますが、そのようなことになると本当に頭がいっぱいです. 何が起こっているのか、それを修正するために何をする必要があるのか​​ について、私は本当に無知です. 私はどんな助けにも感謝します - 推測でも、正しい方向への単なる指摘でも。

共有 Web ホスト (HostGator) を使用していることに注意してください。2 日前にチケットを送信し、フォーラムに投稿しました。また、会社に電子メールを送信しましたが、まだ返信がありません。

- 編集 -

これは、parallelcurl を使用して複数のリクエストを実行するコードです。インクルードはそのままにしてあり、ここに示されているものと同じです

接続できるかどうかを単純に確認するために使用するコードは次のとおりです

接続できないときにそれを実行すると、次のようになります。

0 投票する
1 に答える
432 参照

php - php cUrl複数リクエスト - すべてのコンテンツを取得

次のスクリプトを使用して複数の URL からコンテンツを取得していますが、変更を加えないと永久に実行されます: https://raw.github.com/jmathai/php-multi-curl/master/EpiCurl.php

複数の URL のコンテンツを並行して取得しようとしています。常に結果を得ることが意図されています。

質問: このスクリプトが永久に実行され、しばらくすると予期したとおりに終了しないのはなぜですか?

0 投票する
2 に答える
1202 参照

php - 特定のカール マルチ レスポンスを特定する

私はcurl_multi_exec()複数のウェブサイトを並行してリクエストしていました。URL1、、、、と言っURL2URL3ください。これらの Web サイトのいずれかが結果を返すとすぐに、それを処理して次の応答を待つことができます。

ここで、リクエストのレスポンスに基づいて、この結果がどの URL から来たのかを知る必要があります。リダイレクトがある可能性があるため、応答から URL を単純に確認することはできません。では、応答がどの URL ( URL1URL2、または) から来たかを識別する最善の方法は何でしょうか? URL3からの情報curl_multi_info_read()またはcurl_getinfo()何らかの形でそのために使用できますか? そのために設定して要求できる cURL オプションはありますか?

また、URL を要求する前に cURL ハンドラーを保存して比較しようとしましたcurl_multi_info_read($curlMultiHandle)['handle']が、これはリソースであるため、実際には比較できません。

何か案は?

0 投票する
2 に答える
465 参照

php - PHP: 真に非同期な方法での http GET/POST

基本的に、私はPHPで次のことを行う方法を探しています:

そして、curl の経験が豊富な人なら、curl_multi が私が探しているものであることを確認できるかもしれません。

http://php.net/manual/en/function.curl-multi-init.phpから収集したものから、そこにあるサンプルで必要なものが得られる場合があります。

さて、主な質問は、これが何をするかについての私の理解は正しいですか?

1)最初のループは、ソケットへのリクエストの送信/書き込みのみを処理します。

2) リクエストが送信された後、すべての http / ソケット処理がバックグラウンドで実行されるため、curl_multi_exec を定期的に呼び出してバッファがどこかでいっぱいになっておらず、保持するためにキックが必要であることを確認する必要がなく、他の処理を自由に行うことができます。行きます。

3) 2 番目のループは、未処理の応答データが到着するのを待ち、応答の読み取りと処理を終了します。

さて、これはまだ完全に非同期ではありません.ソケットの書き込みバッファがいっぱいになると、リクエストの書き込みがブロックされる可能性がありますが、私のシナリオではそれは問題ではありません。次に curl_multi_exec を呼び出す機会が来るまで、全体がフリーズしないようにします。

これは、2k-4k 応答の一般的なシナリオの場合でも問題ありません。より大きな応答は、2 番目のループに到達するまでバックグラウンドで何もせずにスタックします。

これはcurl_multiの仕組みですか?そうでない場合、PHP でこれを行うには何が提案できますか?

0 投票する
0 に答える
147 参照

php - PHP スクリプトは、別々の部分よりも順番に実行する方が遅いのはなぜですか?

奇妙な問題に遭遇しました。誰かが私を助けてくれることを願っています。Web サイトからキーワードを削除する multiCurl スパイダーを PHP で作成しましたが、奇妙なパフォーマンスの問題が発生しています。

スパイダーを実行してサイトの最初の数レベルをスクレイピングすると、完了するまでに約 2 分かかりますが、これは私の目的にとってはそれほど大きな問題ではありません。奇妙なのは、同じスクリプトでスパイダーを次々と実行しようとすると、何らかの理由でランタイムがバルーン化することです。たとえば、7 つのサイトで順次実行する場合、14 分 (1 サイトあたり 2 分) かかると予想されますが、実行には 45 分以上かかります。各サイトを個別にテストしたところ、実際には平均して 2 分以下でしたが、順番に実行するとほぼ 1 時間かかりました。

メモリの問題と関係があるのではないかと考えたので、スクリプトの実行中にキーワード データを格納する APC キャッシュを実装しました。問題は、タスク マネージャー (私は Windows 7 で XAMPP を実行しています) を見ると、Apache サーバーは CPU の 46K/23% をはるかに超えていないようで、私のコンピューターの他のすべては問題なく動作します。 .

よく調べて、適切なすべてのハンドラーができるだけ早く閉じられていること、大きな変数が設定解除/キャッシュされていることを確認しましたが、実行に予想よりも 3 倍の時間がかかる理由についてまだ頭を悩ませています。相次ぐサイト。私は pcntl を使用してスパイダーをフォークしてプロセスを分離しようとするルートをたどろうとしています (Linux のサム ドライブ インストールを試してみます)。アプリケーションのパフォーマンス ヒット。ありがとう!