ホームページ >バックエンド開発 >PHPチュートリアル >PHP が大量のデータを実行すると、要約操作に時間がかかりすぎて、Web ページが失敗します。
PHP
実行時間は約 2 時間で、その後ページは無効になります。ご存知の方がいらっしゃいましたら、ご協力いただけると大変助かります。統計的な要約を処理するにはCなどの他の言語に変更してください
コードはどこにありますか。 。 。 。
function fourselect(){
$db = Db::getInstance();
//エンコーディングに基づいてデータをクエリします
$id=$_REQUEST['id'] //id
$datamonth=$_REQUEST[' datamonth ']; //Date
$ids=explode(',',$id); //Interception
$jxtblist=""; // プログレスバーの識別を制御します
$datalist; // プロンプト情報を返します
$datalist1;
if(!empty($id)){
foreach($ids as $key=>$li){
$jxtbsql="select * from jx_tbprofile where id=". $li ;
$jxtblist =$db->query($jxtbsql);
foreach($jxtblist as $key=>$li1){
if($li1[execlevel]==0){ // 0 ステージ
$list;
$success=0;//完了したトランザクションの数
//最初に宛先フィールドの設定が間違っているかどうかを判断します
$strtab="select * from jx_tbprofile_dtl where tableno='".$li1[tableno ]."' "; //フィールド名を取得します
$listtab=$db->query($strtab); $strcol="show columns from ".$li1[desttable] //宛先テーブルのフィールド名を取得します
$listcol=$ db->query($strcol);
$ziduan;
foreach ($listtab as $keytab=>$litab) {//宛先テーブルのフィールドを設定します
($listcol as $ keycol=>$licol)//宛先テーブルフィールド
{
if($litab[dest_column]==$licol['Field']){
$boole=true;同様に一致する場合は、$boole に true を代入します。
//echo "Equal";
}else{
//echo $litab['Field']
$boole=false; !$boole){//構成テーブルのフィールドを対応させた後、$boole の値を取得し、それが false の場合は、変更されたフィールドを $ziduan 関数に保存し、プロンプト メッセージを追加します
$ziduan=$ziduan.$ litab[dest_column];
$boole=false;
Break;
}
}
if(!$boole){
$datalist=$datalist."宛先フィールド ".$ziduan." が見つかりません。設定エラーです!";
}else{
//古いデータをクリアします
$sql=str_replace("|datamonth|",$datamonth,$li1[sqldeldest]);//設定された削除ステートメント
// echo $sql
//mysql_query( $sql) または die(mysql_error());
if (mysql_query($sql)){
//echo mysql_query($sql);
$datalist=$datalist."元のデータ テーブルはクリアされました!
$sql1 =$li1[remarks];//設定されたクエリ文
$re=str_replace("|datamonth|",$datamonth,$sql1); //置換文字
$list1 =$db-> ; query($re );
//mysql_query($re) または die(mysql_error());
foreach($key=>$ li2)
{
//$User = A($li1[tableno]); // アクション コントローラー オブジェクトをインスタンス化します
foreach ($listtab as $key=>$litab){
if(!empty($litab) [マーク] )){//宛先テーブルのデフォルトのフィールド名マーク。
//echo $litab[mark];
$_POST[$litab[dest_column]]=$litab[mark]
}else{
$_POST[$litab[dest_column]]=$li2[$litab[source_column] ];
}
}
//$User->fuValues1($li2);
$bo=$jx->add(); $success+1; //成功したトランザクションの数
}
//echo date("Y-m-d h:i:s")."
".$li1[tableprofile]."決済完了! 成功" . $success."ペン データ。
";
$datalist=$datalist.date("Y-m-d h:i:s")."
".$datamonth.$li1[テーブルプロファイル]。 " 決済が完了しました。正常に完了しました。".$success."Data.
";
}else{
$datalist=$datalist."削除ステートメントに問題がありました!
}
}
$this->assign('isok',$isok);
}
}
}
}
}
自分で分析してください。実行に時間がかかりすぎるコード行をマークできます。
$list1 =$db->
//mysql_query($re) または die(mysql_error());
foreach( $list1 as $key=>$li2)
{
//$User = A($li1[tableno]) // アクション コントローラー オブジェクトをインスタンス化します
foreach ($listtab as $key=>$ litab) {
if(!empty($litab[mark])){//宛先テーブルのデフォルトのフィールド名マーク。
//echo $litab[mark];
$_POST[$litab[dest_column]]=$litab[mark]
}else{
$_POST[$litab[dest_column]]=$li2[$litab[source_column] ];
}
}
//$User->fuValues1($li2);
$bo=$jx->add(); $success+1; //成功したトランザクションの数
}
このセクションでは、クエリ ステートメントを実行し、結果を宛先テーブルに 1 つずつ挿入します。ソーステーブル、宛先テーブル、クエリステートメント、および削除ステートメントの別のテーブルで構成しました。このコードで構成されたデータを検索し、クエリ テーブルを実行して新しいテーブルに挿入します。このうち4つのデータは比較的大きなデータです。単独ではかなり速く実行できますが、4 つを同時に実行すると、ブラウザーが障害を起こすまでに長い時間がかかります。
set_time_limit(0);? ? ?
最終的に生成された SQL を投稿して見てください。テーブル構造とインデックスの状況を明確に説明してください。 これらの3つのテーブル間でデータを変換しますjx_zy_detail_charge_belong、jx_zy_detail_charge_force、jx_zy_detail_charg月、JX_ZY_DETAIL_CHARCH_BELONG_CHARTY_DATE、JX_ZY_DETAIL_CHAREX_BELONG.OP_ID_CODE、age、
JX_Zy_detail_Charge_belong.ward_code .dept_code、
jx_zy_detail_charge_belong.order_no、
jx_zy_detail_charge_belong.exec_unit detail_charge_belong.charge_code = jx_mz_charge_item.fee_code and
(jx_mz_charge_item.exec_unit is nullまたは
jx_mz_charge_item.exec_unit = ' ')
ユニオンAll Select JX_Zy_Detail_Charge_Belong.Data_Month、
JX_ZY_DETAIL_CHARNG_BELONG.INPATIENT_NO Charge_code、
Jx_ Zy_detail_Charge_belong.Charch_fee、
Jx_zy_detail_charge_belong.percentage、zy_detail_charge_belong.serial、jx_zy_detail_chare_belong。 key_col,
jx_zy_detail_charge_belong.pat_name
FROM jx_zy_detail_charge_belong ,jx_mz_charge_item
WHERE jx_zy_detail_charge_belong.data_month = '|datamonth|' および
jx_zy_detail_charge_belong.charge_code= jx_mz_charge_item.fee_code および
jx_mz _charge_item.exec_unit が null ではない および
jx _mz_charge_item.exec_unit <>'
は構成テーブルからのものです, jx_mz_charge_item でこのテーブルのcharge_codeとfee_codeを見つけ、構成テーブルのexec_unitが条件を満たしていることがわかったら、この値を使用して元のテーブルの部門の値を置き換えます
2番目の変換クエリSQL: jx_zy_detail_charge_force-》 jx_zy_detail_charge
data_month、inpatient_no、charge_date、op_id_code、charge_code、charge_fee、dept_code、exec_unit、retprice、charge_amount、serial、bill_code、pat_name を jx_zy_detail_charge_force から選択します
jx_zy_detail_charge_force.exec_unit が含まれていない場合 (jx_code_ から説明を選択します) ctl where item_no like 'ordept%' ) と data_month= '|datamonth|'
すべて結合
data_month、inpatient_no、charge_date、op_id_code、charge_code、charge_fee、dept_code、exec_unit、retprice、charge_amount、serial、bill_code、pat_name を選択します
jx_zy_detail_charge_force から
ここで jx_zy_detail_charge_force.exec_uni入っている(選択してください) jx _code_ctl の説明 ( item_no が 'ordept%' の場合) ではなく
( jx_zy_detail_charge_force.bill_code ( item_no が 'orbill%' の場合の jx_code_ctl から説明を選択) またはjx_code_ctl の説明 (item_no like 'zlbill%') ) および data_month= '|datamonth|'
すべて結合
data_month、inpatient_no、charge_date、op_id_code、charge_code、charge_fee、dept_code、dept_code、retprice、charge_amount、serial、bill_code、pat_name を選択
jx_zy_detail_charge_force から
where jx_zy_detail_charge_force.exec_unit in (j から説明を選択x_code_ctl ここでitem_no like 'ordept%' ) および
( jx_zy_detail_charge_force.bill_code in (item_no like 'orbill%' の jx_code_ctl から説明を選択) または
jx_zy_detail_charge_force.bill_code in (item_no like 'zlbill%' の jx_code _ctl から説明を選択) ) および data_month ='|datamonth|'
すべて結合
data_month、inpatient_no、charge_date、op_id_code、charge_code、charge_fee、dept_code、dept_code、retprice、charge_amount、serial、bill_code、pat_name を選択
jx_zy_detail_charge_force から
ここで、jx_zy_detail_charge_force.exec_unit は null で、data_month = ' |datamonth|'
テーブル jx_code_ctl に実行部門 exec_unit フィールドが設定され、テーブル jx_code_ctl に課金カテゴリ bill_code フィールドも設定されます。 データの実行部門 exec_unit が請求部門 dept_code に変更されます。
に分かれています。 外来テーブルと入院テーブルの手順は同じです。 ここでは、外来患者と入院患者の最初の SQL を実行し、次に外来患者と入院患者の 2 番目の SQL を実行します。速度的には1時間程度で完了しますが、4つの項目を同時に実行すると時間がかかり、ページもハングします。
バックグラウンドでの実行により必要なデータが生成され、フロントエンドで結果が表示されます。
バックグラウンドでの実行により必要なデータが生成され、フロントエンドで結果が表示されます。 はい、データ量が最も多いこれら 4 つのデータを一緒に実行すると非常に時間がかかりますが、そのうちの 2 つを実行するとはるかに高速になります。
EXPLAIN コマンドを使用して SQL コマンドをチェックし、mysql が提供する提案を確認します
EXPLAIN コマンドを使用して SQL コマンドをチェックし、mysql が提供する提案を確認します