私は約140のURLを含むデータベースを持つPHPアプリケーションを構築しています。PHP curlで多くのWebページをダウンロード
目的は、これらのWebページのコンテンツのコピーをダウンロードすることです。
私はすでに自分のデータベースからURLを読み取って、curlを使ってページのコピーを取得するコードを書いています。その後、<body> </body>
の間のすべてを取得し、ファイルに書き込みます。また、リダイレクトも考慮されます。私がURLに行き、応答コードが302であれば、それは適切なリンクに従います。ここまでは順調ですね。
これはすべてURLの数(多分20秒程度)でもOKですが、max_execution_time
が30秒に設定されているため、スクリプトのタイムアウトが発生します。私はそれを無効にするか、またはこれを増やしたくない。私はそれが貧弱な解決策だと感じているからだ。
私は2つの回避策を考えましたが、これが良い/悪いアプローチか、より良い方法があるかどうかを知りたいと思います。
最初のアプローチは、タスクを一度に20行に分割する(つまり、140行がある場合はスクリプト7の別々の時間を実行する)ように、データベースクエリでLIMIT
を使用することです。私はこのアプローチから、スクリプトを呼び出す必要があることを理解しています。download.phpは7回に分かれており、LIMIT数値を渡す必要があります。
2番目は、個々のデータベースレコードのIDを渡すスクリプトを用意し、そのURLに(たとえばdownload.php?id=2
)を入力してから、複数のAjaxリクエスト(download.php?id=2, download.php?id=3, download.php?id=4
など)を実行します。 $_GET['id']
に基づいて、データベースなどのURLを検索するクエリを実行することができます。理論的には、URLごとに1つのリクエストが設定されているため、140個の別々のリクエストを行います。
私はキューイングシステムを指摘している他の投稿を読んだことがありますが、これは私の知る限りではありません。これが最善の方法である場合は、見てみる価値のある特定のシステムがありますか?
ご協力いただければ幸いです。
編集:現在、140のURLがありますが、これは時間とともに増加する可能性があります。だから私はタイムアウトの制限を打つことなく拡大縮小するソリューションを探しています。
140ページをつかむためにどのくらいの時間がかかるか、またはサーバーが遅れていくつかの要求を他のものよりも長くするように思っているので、おそらくmax_execution_timeを変更するのが最適な解決策です。 – Brogan
タイムアウトを延長するのは貧弱な解決策ではありません。ループの各ステップ(または単一のページに賢明なもの)には、['set_time_limit(30)'](http://php.net/manual/en/function.set-time-limit.php)を使用してください。 「cURL呼び出しごとにX秒を許可します」というのは妥当なことです。 – apokryfos
私はajaxコールのアプローチに行きます。データベース上のすべてのレコードを取得し、それを反復してAjax呼び出しを送信し、完了したら何かを報告することができます。スクリプトを呼び出して(そして作業をして)報告して、次のようなことを言うことができます: "XのうちXが完了し、Yがエラー" – LordNeo