作者:林子木
為防止惡意轉載,放本文連結 http://blog.csdn.net/wolinxuebin/article/details/7722424 可能本文有錯誤,會及時修改,請參看上面連結,查看最新更新。
最近在做一個東西,用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)
在網址http://hi.baidu.com/shouji163/item/a604ddf3534aec2a84d2784a中,有更多關於此種方法的介紹。
第二種
本人很喜歡,是利用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';?><?phpinclude'C:\\Program Files\\Zend\\Apache2\\htdocs\\pic_gather\\pic_operate.php';echo "\rfinish";ob_flush();exec("pause");?>
來自論壇:http://bbs.chinaunix.net/thread-527114-1-1.html
是批處理命令,所以我還花了1個小時特地看了下批處理命令。大致翻譯下上面的程式。
@:不顯示後面的指令,如果去掉,指令會在命令視窗中列印出來
REM 是批處理的注釋,後面的是注釋,不執行。跟@不同,@只是命令不列印出來,並不表示注釋。
程式開始執行,首先是bat運行
@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的值
@%PHPCLI% %0
%PHPCLI% 代表的就是你上面設定的路徑,這裡表示執行php.exe,然後%0代表此.bat檔案所在的路徑, 連起來的意思就是用php.exe運行.bat檔案。
會出現上面現象呢,php可不認為REM是注釋呀,只認為是普通的字元。
就會首先列印@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.exe可認識了,表示上面意思。在php中@可認識否。這個表示抑制錯誤,那麼就是字串‘’中的內容與REM進行==,那麼有被@抑制錯誤。安然度過。
進入下一段
<?phpinclude'C:\\Program Files\\Zend\\Apache2\\htdocs\\pic_gather\\pic_operate.php';echo "\rfinish";ob_flush();exec("pause");?>
這裡就是你要執行的程式了。我不想寫在這裡面,那麼就include一下,這樣容易讓.bat成為一個模板。
到此你的php.exe算是走完了,可是還沒完呢,剛剛批處理命令才到
@%PHPCLI% %0
之後為了不讓批處理命令不認識php的語言,用了
@goto :EOF
來結束程式。
有人問為什麼不直接這樣:
@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()函數就有這樣的功能。
例如:UPDATE `game_3533_com_lingsheng` SET `music`=concat('ring_gather/funny/',`music`) WHERE `class`='搞笑鈴聲'