程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP 批處理 處理大數據 長時間處理

PHP 批處理 處理大數據 長時間處理

編輯:關於PHP編程

  最近在做一個東西,用PHP寫的,由於要將數據庫中的圖片名字讀出來,然後訪問對應圖片,讀取圖片的大小以及分辨率,重新存入數據庫。數據量現在才是處理5000條的,如果不加任何設置的話,php默認最大執行時間是30秒。

     所以30秒內,我只能處理700條,剛開始只能手動,七百、七百的執行了。後來感覺這樣不行,以後的數據量會過10W,這樣會累死我的。

     網上搜索了下,有三種處理方式。

    第一種

    很直接,既然你默認30秒,那麼我就把你的默認時間設置長點,或者直接沒有限制。

    在php中添加,php ini_set('max_execution_time', '100');函數就可以了,100代表100秒,如果你設置了0,那麼就代表沒有限制。(ps:我用的是zend的結合,設置為0的時候,不是沒有限制,而是大概是120的樣子,我的解決方法是,把這個值設置的so big)

  
    第二種

    本人很喜歡,是利用php和批處理的結合。

  
[php] 
@REM<?php 
@REM ==' 
@SET PHPCLI="D:\Program Files\Zend\Zend Studio - 8.0.1\plugins\org.zend.php.debug.debugger.win32.x86_5.3.18.v20110322\resources\php53\php.exe" 
@REM PHPCLI 設置你的php.exe的路徑 
@%PHPCLI% %0 
@goto :EOF 
@REM';?> 
<?php 
include'C:\\Program Files\\Zend\\Apache2\\htdocs\\pic_gather\\pic_operate.php'; 
echo "\rfinish"; 
ob_flush(); 
exec("pause"); 
?>  

是批處理命令,所以我還花了1個小時特地看了下批處理命令。大致翻譯下上面的程序。

@:不顯示後面的指令,如果去掉,指令會在命令窗口中打印出來

REM 是批處理的注釋,後面的是注釋,不執行。跟@不同,@只是命令不打印出來,並不表示注釋。


程序開始執行,首先是bat運行

[php]
@SET PHPCLI="D:\Program Files\Zend\Zend Studio - 8.0.1\plugins\org.zend.php.debug.debugger.win32.x86_5.3.18.v20110322\resources\php53\php.exe" 
設置了PHPCLI的值
[php] view plaincopy
@%PHPCLI% %<span style="font-family: Arial,Helvetica,sans-serif;">0</span> 
    %PHPCLI% 代表的就是你上面設置的路徑,這裡表示執行php.exe,然後%0代表此.bat文件所在的路徑, 連起來的意思就是用php.exe運行.bat文件。

   會出現上面現象呢,php可不認為REM是注釋呀,只認為是普通的字符。

   就會首先打印@REM,然後

[php] 
<?php 
@REM ==' 
@SET PHPCLI="D:\Program Files\Zend\Zend Studio - 8.0.1\plugins\org.zend.php.debug.debugger.win32.x86_5.3.18.v20110322\resources\php53\php.exe" 
@REM PHPCLI 設置你的php.exe的路徑 
@%PHPCLI% %0 
@goto :EOF 
@REM';?> 
這裡,php.exe可認識了,表示上面意思?在php中@可認識否?這個表示抑制錯誤,那麼就是字符串‘’中的內容與REM進行==,那麼有被@抑制錯誤。安然度過。

進入下一段

[php] 
<?php 
include'C:\\Program Files\\Zend\\Apache2\\htdocs\\pic_gather\\pic_operate.php'; 
echo "\rfinish"; 
ob_flush(); 
exec("pause"); 
?>  
這裡就是你要執行的程序了。我不想寫在這裡面,那麼就include一下,這樣容易讓.bat成為一個模板。

到此你的php.exe算是走完了,可是還沒完呢,剛剛批處理命令才到

[php] 
@%PHPCLI% %0 
之後為了不讓批處理命令不認識php的語言,用了

[php]
@goto :EOF 
來結束程序。
有人問為什麼不直接這樣:

[php] 
@SET PHPCLI="D:\Program Files\Zend\Zend Studio - 8.0.1\plugins\org.zend.php.debug.debugger.win32.x86_5.3.18.v20110322\resources\php53\php.exe" 
@REM PHPCLI 
@%PHPCLI% %0 
@goto :EOF 
 
<?php 
    include'C:\\Program Files\\Zend\\Apache2\\htdocs\\pic_gather\\pic_operate.php'; 
echo "\rfinish"; 
ob_flush(); 
exec("pause"); 
?>  
不用搞這麼復雜,我也試了下,

發現cmd命令行會出現:

@SET PHPCLI="D:\Program Files\Zend\Zend Studio - 8.0.1\plugins\org.zend.php.debu
g.debugger.win32.x86_5.3.18.v20110322\resources\php53\php.exe"
@REM PHPCLI
@%PHPCLI% %0
@goto :EOF

這代碼的原作者,就是想避免出現這樣的情況,然打印出太多的垃圾信息。

所以說這才是原作者的精辟之處呀。

    第三種

    這個如果你,僅僅只要更新裡面的字符串信息,比如你設置了class類,如果class='自然風光',那麼就把image前面加上pic_gather/nature/image。那麼沒有必要用上面的這麼復雜的東西,直接用sql語言就行了,concat()函數就有這樣的功能。

作者:wolinxuebin

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved