多大的數(shù)據(jù)叫大數(shù)據(jù)???只能說數(shù)據(jù)越大讀得越慢,但只要給足夠的內(nèi)存、足夠的時間,再大的數(shù)據(jù)也能讀出來。
創(chuàng)新互聯(lián)是一家專注于成都做網(wǎng)站、網(wǎng)站設(shè)計、外貿(mào)營銷網(wǎng)站建設(shè)與策劃設(shè)計,盈江網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:盈江等地區(qū)。盈江做網(wǎng)站價格咨詢:028-86922220
你所說的這個問題,應(yīng)該不是PHP和mysql的問題,任何程序語言,任何數(shù)據(jù)庫,在硬件限制和執(zhí)行時間限制的情況下,數(shù)據(jù)無限增大,都終究會讀不出來。
微軟的Excel設(shè)置單元格行數(shù)默認(rèn)是6萬行rows,相對的講其實當(dāng)我們超過1萬行的時候已經(jīng)是大數(shù)據(jù)的導(dǎo)出。
好比:有客戶10000人,平均每人每天產(chǎn)生10條活動記錄,要導(dǎo)出上周所有的客戶活動記錄: 10000*10*7=700000
估計看70萬行的Excel這個人會瘋掉的,我們的建議是分批次導(dǎo)出,按時間導(dǎo)出到不同的excel
下面是一個PHPExcel官方的Demo(已修改過)
復(fù)制代碼
define('EOL', 'br /');
$objPHPExcel = new \app\extensions\PHPExcel\PHPExcel();
ini_set("memory_limit", "1024M"); // 設(shè)置php可使用內(nèi)存
$cacheMethod = \PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip;
if (!\PHPExcel_Settings::setCacheStorageMethod($cacheMethod)) {
die($cacheMethod . " 緩存方法不可用" . EOL);
}
echo date('H:i:s'), " 當(dāng)前使用的緩存方法是: ", $cacheMethod, " 方式", EOL;
echo date('H:i:s'), " 開始設(shè)置文檔屬性", EOL;
$objPHPExcel-getProperties()-setCreator("Maarten Balliauw")
-setLastModifiedBy("Maarten Balliauw")
-setTitle("Office 2007 XLSX Test Document")
-setSubject("Office 2007 XLSX Test Document")
具體的還有很多寫不下,我是在后盾人看的教學(xué)視頻無意中學(xué)到的,正好解答給你希望能幫到你
在使用PhpMyAdmin的時候經(jīng)常用到數(shù)據(jù)的導(dǎo)入和導(dǎo)出(Export/Import),但是在導(dǎo)入大數(shù)據(jù)的時候由于php上傳文件的限制和腳本響應(yīng)時間的限制,導(dǎo)致phpMyAdmin無法導(dǎo)入大數(shù)據(jù)。很多時候都是由于文件過大,從本地瀏覽上傳導(dǎo)入,容易中斷失敗,有沒有更好的方法呢?
方法:
在phpMyAdmin的目錄下,找到根目錄的config.inc.php文件,
打開config.inc.php文件,查找$cfg['UploadDir'],這個參數(shù)就是設(shè)定導(dǎo)入文件存放的目錄,這里把值設(shè)定為:ImportSQLFile。
在phpMyAdmin目錄下,建立以ImportSQLFile命名的文件夾,
把我們需要導(dǎo)入的數(shù)據(jù)文件,放到ImportSQLFile文件夾下面,非常簡單,
登入phpMyAdmin,選擇需要導(dǎo)入的數(shù)據(jù),點擊導(dǎo)航條上面的“導(dǎo)入”按鈕,
選中“從網(wǎng)站服務(wù)器上傳文件夾ImportSQLFile/中選擇:”選項,并需要導(dǎo)入的數(shù)據(jù)文件,
最后點擊“執(zhí)行”,即可導(dǎo)入成功。
注意事項
如果在config.inc.php文件,沒有找到$cfg['UploadDir'],可以自己在文件中添加上去即可。
應(yīng)該是你的數(shù)據(jù)庫配置限制了內(nèi)存使用量導(dǎo)致的.建議查找下相關(guān)mysql配置資料.
直接倒序取一部分,如果可以就應(yīng)該是配置的問題.
如果慢的話要考慮字段優(yōu)化
問題需要具體.不銘感的話可以把數(shù)據(jù)發(fā)來我調(diào)試一下看看.
1、建議你讀寫數(shù)據(jù)和下載圖片分開,各用不同的進程完成。
比如說,取數(shù)據(jù)用get-data.php,下載圖片用get-image.php。
2、多進程的話,php可以簡單的用pcntl_fork()。這樣可以并發(fā)多個子進程。
但是我不建議你用fork,我建議你安裝一個gearman worker。這樣你要并發(fā)幾個,就啟幾個worker,寫代碼簡單,根本不用在代碼里考慮thread啊,process等等。
3、綜上,解決方案這樣:
(1)安裝gearman worker。
(2)寫一個get-data.php,在crontab里設(shè)置它每5分鐘執(zhí)行一次,只負(fù)責(zé)讀數(shù)據(jù),然后把讀回來的數(shù)據(jù)一條一條的扔到 gearman worker的隊列里;
然后再寫一個處理數(shù)據(jù)的腳本作為worker,例如叫process-data.php,這個腳本常駐內(nèi)存。它作為worker從geraman 隊列里讀出一條一條的數(shù)據(jù),然后跟你的數(shù)據(jù)庫老數(shù)據(jù)比較,進行你的業(yè)務(wù)邏輯。如果你要10個并發(fā),那就啟動10個process-data.php好了。處理完后,如果圖片地址有變動需要下載圖片,就把圖片地址扔到 gearman worker的另一個隊列里。
(3)再寫一個download-data.php,作為下載圖片的worker,同樣,你啟動10個20個并發(fā)隨便你。這個進程也常駐內(nèi)存運行,從gearman worker的圖片數(shù)據(jù)隊列里取數(shù)據(jù)出來,下載圖片
4、常駐進程的話,就是在代碼里寫個while(true)死循環(huán),讓它一直運行好了。如果怕內(nèi)存泄露啥的,你可以每循環(huán)10萬次退出一下。然后在crontab里設(shè)置,每分鐘檢查一下進程有沒有啟動,比如說這樣啟動3個process-data worker進程:
* * * * * flock -xn /tmp/process-data.1.lock -c '/usr/bin/php /process-data.php /dev/null 21'
* * * * * flock -xn /tmp/process-data.2.lock -c '/usr/bin/php /process-data.php /dev/null 21'
* * * * * flock -xn /tmp/process-data.3.lock -c '/usr/bin/php /process-data.php /dev/null 21'
不知道你明白了沒有