PHP同時キャプチャを使用しているときにキャプチャが完了したかどうかを確認するにはどうすればよいですか?

WBOY
リリース: 2016-06-23 14:11:12
オリジナル
1102 人が閲覧しました

写真をキャプチャして zip にパッケージ化するプログラムがあります。
現在、遅すぎるためシングルスレッドを使用しています。そこで、マルチスレッドの同時キャプチャを使用したいと考えています。
でもこれをやると、いつ zip パッケージ化できるかわかりません。
ヒーローの皆さん、いくつか提案をください


ディスカッション (解決策) に返信してください

キャプチャした後でのみディスクに書き込まれます
プログラム内でターゲット リストを管理し、ターゲット リスト内のすべてのファイルが保存されると、リストが存在する場合、パッケージ化できます

マルチスレッド同期の問題、セマフォ同期。

写真をキャプチャする方法、共有できますか?

マルチスレッド同期の問題、セマフォ同期。

親愛なる友人、もっとわかりやすく説明してもらえますか?

キャプチャされた後にのみディスクに書き込まれます
プログラム内でターゲットリストを管理します。リスト内のすべてのファイルが存在する場合、それらをパッケージ化できます

モデレーター この方法を考えました。かなり面倒だと思います。なぜなら、循環させるトピックが何百もあり、1 つのトピックに 7 ~ 8 枚の写真が含まれているからです。
毎回、コンテンツ内の画像アドレスが通常のルールに従って取得され、サーバーにキャプチャされ、画像のサイズが縮小されます。

記録が必要な場合は、複数のプロセスを同時に実行するループにする必要があります。実行が完了したら、次のループに入ります。

写真のキャプチャ方法を教えてください

写真をキャプチャするのは難しくありません
最も簡単な方法は file_get_contents です

どの写真がどのトピックに属しているかを記録しませんか?

どの写真がどのトピックに属するかを記録しませんか?

関連するピクチャーレコードテーブルはありません
コンテンツは頻繁に更新する必要があるため、現時点では追加する意味がありません。

通常のマッチングを使用するたびに、トピックごとにフォルダーを作成し、写真の数を数えて、このデータをフォルダー内の特別なファイル (.number など) に書き込みます。

これらのフォルダー内のファイルを継続的にスキャンし、特殊ファイル内のファイル数と比較する別のパッケージング プログラムを作成して、ファイル数が等しい場合は、直接パッケージ化してフォルダーを削除します。

PV運用。 。セマフォを維持する必要があります。簡単に言うと変数です。プログラムを実行する前にキャプチャするファイルの数がわかっている場合、この値は最初に決定されます。たとえば、5 枚の写真をキャプチャすることがわかっている場合、この変数の値は 5 になり、それぞれのサブプロセスは 1 つの画像キャプチャを完了します。アクション変数が 1 つ減少し、最終的に 0 になると、すべてのキャプチャが完了したことを意味します。

最初にキャプチャする写真の枚数がわからない場合は、このセマフォを動的に維持する必要があり、プロセス間の同期を制御するために他のセマフォを追加する必要があります。たとえば、セマフォが 0 である可能性がありますが、実際にはキャプチャする静止画があるかどうかを解析するプロセスがまだあり、セマフォが 0 であるため、プログラムは直接終了します。この状況も考慮する必要があります。

また、マルチスレッドはどのように使用しますか? PHP はマルチスレッドをサポートしていません。

Apache マルチスレッド コンポーネント
iframe を使用してそれを実現することもできます

さらに、マルチスレッドはどのように使用しますか? PHP はマルチスレッドをサポートしていません。

php 5.+ 以降の Curl はマルチスレッドをサポートします。ダウンロードするたびにパッケージ化する必要がありますか?

通常のマッチングを使用するたびに、トピックごとにフォルダーを作成し、写真の数をカウントし、このデータをフォルダーの下の特別なファイル (たとえば、.number wait!) に書き込みます。


これらのフォルダー内のファイルを継続的にスキャンし、特殊ファイル内のファイル数と比較する別のパッケージング プログラムを作成して、ファイル数が等しい場合は、直接パッケージ化してフォルダーを削除します。

この方法はかなり良いです。でも、時計を使ったほうが、より多くのことを思い出すことができるので良いかもしれません。たとえば、キャプチャがトリガーされた写真、キャプチャのステータス、完了時間などです。

ここで簡単に状況を説明します
ソフトウェア側の専用アプリにそのような機能があるためです。
ユーザーがトピックを参照するには、オフライン パッケージをダウンロードできる必要があります。

ソフトウェアと合意された形式は zip です

zip 内の構造は次のとおりです
フォルダー (トピック ID) は複数のトピック画像とトピック ホームページに対応します
そして、複数のトピックはフォルダー名トピック ID を持つ複数のフォルダーを生成します。

私の現在の仕事は、これらのトピックのフォルダー データを生成し、zip にパッケージ化することです。ダウンロード用のソフトウェアを提供します。
テーマ画像は、テーマコンテンツ内の通常の画像アドレスと一致することによってキャプチャされます。
現在、何百ものトピックが原因で問題が発生しています。 1 つのトピックに 8 ~ 9 枚の写真があるため、クロール速度が非常に遅くなります。

または、各サイクルで通常の一致する画像の数を記録するテーブルが必要です。キャプチャが成功または失敗するたびにこの量を減らします。
次に、プログラム内でこの数量をクエリし、ゼロになったら次のトピックに入ります。


また、マルチスレッドはどのように使用しますか? PHP はマルチスレッドをサポートしていません。


方法がある場合は、fsockopen を使用してキャプチャ プログラムのリンクをトリガーできます。リンクが戻るのを待つ必要はなく、プログラムは引き続き実行されます。

Curl はクロールに使用する必要があり、テクノロジーはシンプルで効率的です

Curl はキャプチャしたデータをファイルに直接書き込むことができます
curl_multi は同時に複数の Curl をマウントできます
curl_getinfo は関連する作業情報を取得できます (必要な場合)

判断時期curl_multi の各メンバーが終了すると、クロールが終了したと判断されます
これは、進捗情報を保存しないという本来の意図にも沿っています

クロールにはcurlを使用するのが最善であり、テクノロジーはシンプルで効率的です

curlはできますキャプチャしたデータをファイルに直接書き込みます
curl_multiは同時に複数のcurlをマウントできます
curl_getinfoは関連する作業情報を取得できます(必要に応じて)

curl_multiの各メンバーが終了したと判断されると、クロールが完了したと判断されます完了しました
これは、進捗情報を保存しないという当初の意図にも沿っています

バージョン メイン: ステータスを記録するために複数のテーブルを追加できますが、このテーブルはどのように設計すべきですか?
パッケージは複数のトピックに関連付けられており、複数のパッケージが zip 操作を同時に生成できます。
こんなテーブル構造を考えてみました

procの構造
id イメージアドレス パッケージid 実行状況(1はキャプチャーを意味します) トピックid

procが現在生成しているパッケージidのレコード数を先頭でクリアします
ループ時トピック
一致 画像アドレスが 1 つのレコードとしてこのテーブルに挿入されます。
キャプチャが成功または失敗した場合に実行ステータスを更新します
最後にループがあります
このテーブルの特定のパッケージがクエリされ、特定のトピックのピクチャ実行ステータスが 1 であるレコードの数が 1 に等しくなるまで規則的に一致する画像の数に応じて、次のトピックがサイクルに入ります。

この生成プロセスには他にも操作がありますが、最初に説明するために重要なものだけを選択しました。

モデレーター 私の proc テーブルの設計は妥当ですか?

モデレーター兄弟 あなたの返事を待っています


このアイデアに基づいてプログラムを書き、午後にテストしました

テストした後、欠点が見つかったら、それを改善できます

問題が見つかったらそれは解決できません。質問してください

fsockopen 画像をキャプチャするスクリプトをトリガーして、午後中ずっと修正しました。 fget がないとトリガーできません。現地で試すことができます。理由がわかりません。


その後、インターネットで

**  * curl 多线程  *   * @param array $array 并行网址  * @param int $timeout 超时时间 * @return array  */  function curl_http($array,$timeout){ 	$res = array(); 	$mh = curl_multi_init();							  //创建多个curl语柄	$startime = getmicrotime(); 	foreach($array as $k=>$url){ 		$conn[$k]=curl_init($url);        curl_setopt($conn[$k], CURLOPT_TIMEOUT, $timeout); //设置超时时间        curl_setopt($conn[$k], CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');        curl_setopt($conn[$k], CURLOPT_MAXREDIRS, 7);	   //HTTp定向级别        curl_setopt($conn[$k], CURLOPT_HEADER, 0);		   //这里不要header,加块效率        curl_setopt($conn[$k], CURLOPT_FOLLOWLOCATION, 1); // 302 redirect        curl_setopt($conn[$k],CURLOPT_RETURNTRANSFER,1);        curl_multi_add_handle ($mh,$conn[$k]); 	}	do {		$mrc = curl_multi_exec($mh,$active);		//当无数据,active=true	} 	while ($mrc == CURLM_CALL_MULTI_PERFORM);		//当正在接受数据时	while ($active and $mrc == CURLM_OK) {		//当无数据时或请求暂停时,active=true		if (curl_multi_select($mh) != -1) {			do {				$mrc = curl_multi_exec($mh, $active);			} while ($mrc == CURLM_CALL_MULTI_PERFORM);		}	} 	foreach ($array as $k => $url) {	  curl_error($conn[$k]);	  //$res[$k]=curl_multi_getcontent($conn[$k]);//获得返回信息	  $header[$k] = curl_getinfo($conn[$k]);//返回头信息	  curl_close($conn[$k]);//关闭语柄	  curl_multi_remove_handle($mh, $conn[$k]);   //释放资源		  	}	curl_multi_close($mh);	$endtime = getmicrotime();	$diff_time = $endtime - $startime;		return array(		'diff_time'=>$diff_time,		'return'=>$res,		'header'=>$header				); 	 } //计算当前时间 function getmicrotime() {	    list($usec, $sec) = explode(" ",microtime());	    return ((float)$usec + (float)$sec);}
ログイン後にコピー
を検索しました

テストしたところ、問題ありませんでした。しかし、ローカルでテストした場合、なぜ file_get_contents がこれより速いのかわかりません。

while ($active and $mrc == CURLM_OK) {        //当无数据时或请求暂停时,active=true        if (curl_multi_select($mh) != -1) {            do {                $mrc = curl_multi_exec($mh, $active);            } while ($mrc == CURLM_CALL_MULTI_PERFORM);        }    }
ログイン後にコピー


また、この文の機能がよくわかりません。上記のリンクがトリガーされました。
この段落は完了を検出するために使用されますか?

うわー

この段落は上記の繰り返しです

curl_multi_select 関数を使用しましたが、それが何をするのかわかりません...


マニュアルには次のように書かれています
curl_multi_select -- cURL に関連付けられたすべてのソケットを取得します拡張子を取得し、「選択」できるようにします
Google は言いました
curl_multi_select - 関連するすべてのソケットとカール拡張機能を取得して、「選択」できるようにします

今日は、このメソッドを使用して勉強してみましょう。写真の数を追跡する必要はありません。

表を使って写真の枚数を記録してください

分かりました 皆さんありがとうございます。ネクタイ!

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート