標籤:start dex int pcl 整合 推送 ceil 提醒 color
背景:每天早晨九點進行推送,使用者3-4萬人
技術瓶頸:php為弱類型的語言,從頭執行到尾,導致推送時間長度長大2個多小時
需求:減少推送時間,限定在半個小時
背景介紹完畢,開始正題:
將資料放入redis中,沒有最佳化前直接從mysql中提取資料,使用popen開啟進程指標執行相應邏輯,一下為部分代碼,代碼依賴關係沒有全部給出,
1 $redis = rediscache();//連結redis 2 $rekey =‘key’;//在這裡要使用方法產生唯一key 3 if ( $redis->exists($rekey) ) { 4 $redis->del($rekey); 5 } 6 . 7 . 8 //資料提取過程. 9 .10 .11 .12 $data = array(//資料提取樣式13 ‘user‘ => array($v[‘userid‘]),14 ‘describe‘ => ‘微笑打卡提醒 第‘ . ceil($day) . ‘天‘,15 ‘thing‘ => ‘微笑打卡‘,16 ‘time‘ => date(‘Y-m-d H:i‘, mktime(9, 0, 0, date(‘m‘), date(‘d‘), date(‘Y‘))),17 ‘url‘ => $jump,18 ‘epiogue‘ => ‘點擊上傳微笑照片>‘,19 );20 $redis->lPush($rekey,serialize($data));//序列化存進列表中21 //設定key的到期時間,及時的歸還伺服器資源22 $length = $redis->lLen($rekey);23 $cell = 10000;//每個小時推送大概的數量24 if ( $redis->exists($rekey) && $length>0 ) {25 $index = $length/$cell;26 if ( intval($index) > 0 ) {27 $redis->expire($rekey,intval($index)*3600);28 } else {29 $redis->expire($rekey,3600);30 }31 }32 //進行多線程推送33 switch (intval($length)) {34 case $length<200:{//一個進程35 pclose(popen("php ./index.php -a 0 -b ".($length-1)." &",‘r‘));36 $return = true;37 break;38 }39 case $length >= 200:{//兩個進程40 if ( $length%2 == 0 ) {//是偶數41 $nextStart = $length/2;42 } else {//是奇數43 $nextStart = floor($length/2);44 }45 46 pclose(popen("php ./index.php -a 0 -b ".($nextStart)." &",‘r‘));//使用後要釋放進程資源47 pclose(popen("php ./index.php -a ".($nextStart+1)." -b ".($length-1)." &",‘r‘));//使用後釋放整合資源48 $return = true;49 break;50 }51 default:52 $return = false;53 break;54}55 return $return;
popen:開啟一個指向進程的管道,該進程由派生指定的 command 命令執行而產生。使用後記得釋放進程資源
php多進程工作