最近在做一個東西,用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