近期做了一個關於百度營銷推廣的一個管理系統(SEM閃投),主要包括閃投欄位到資料庫欄位的關係映射,多庫多表數據的查詢封裝組合到最後生成XML文件,最終SFTP到另一個資源伺服器上,然後百度要能夠訪問這個XML並解析它,你在百度上搜索某個關鍵詞的時候,最上面的幾條帶廣告字樣的,那麼就達到效果了(關鍵是... ...
近期做了一個關於百度營銷推廣的一個管理系統(SEM閃投),主要包括閃投欄位到資料庫欄位的關係映射,多庫多表數據的查詢封裝組合到最後生成XML文件,最終SFTP到另一個資源伺服器上,然後百度要能夠訪問這個XML並解析它,你在百度上搜索某個關鍵詞的時候,最上面的幾條帶廣告字樣的,那麼就達到效果了(關鍵是 money!!!)
在這過程中遇到了一些問題,也踩了不少坑。。在此記錄一下;
第一步:多庫多表的數據查詢,從庫里拿到元數據由於數據量以後會越來越大,首先計算出總的數據量,然後做分頁查詢,先查詢主表的數據,每次查詢的數據量為1000(可配置),然後根據查詢的這1000條數據的主鍵ID迴圈查詢其它擴展表的擴展表數據,到此第一次取元數據結束;
第二步:閃投欄位賦值,分為以下幾部分:
1.元數據與閃投欄位映射關係中對應的欄位作數據替換處理
2.映射欄位中常量里的特殊欄位進行替換操作。
3.通過第一次拿到的元數據,再去關聯其它的庫表進行查詢得到數據,把拿到的數據
進行1一樣的替換處理。
通過以上對數據的處理,已經得到最終輸出到XML里的數據,這裡會以每2000(可配置)條數據輸出到一個XML文件里。
第三步:最後拿到處理好的數據,直接輸出到XML文件里(在數據輸出的時候又稍做了些替換,主要處理邏輯還是在第二步)
第四步:將生成的XML文件上傳資源伺服器。
在生成本地文件後,會有上傳到遠程伺服器的動作,這裡是個同步的操作,即我會記錄
上傳成功/失敗狀態,然後入庫
遇到的問題及處理方案:
每次查詢的數據量要可配置:
在查詢數據的時候,每次查詢的數據量不能固定寫在程式里,由於每個環境的伺服器配置及性能問題,以後更改方便,所以定義在配置文件里。
由於取擴展表數據的時候是in主表的主鍵ID,在實際生產環境里只配置了500,在每次輸出數據到XML文件完成後,即要釋放一次數據占用的記憶體;
保存數據到XML文件里遇到的問題:
即寫入數據到XML文件的時候用的是file_put_contents,發現會有文件寫的不完整,也就是文件還沒寫完,程式繼續往下執行了,臨時解決方案是sleep,但最終這裡還是需要優化(後面會改成fwire);
寫入XML文件內容中有用 <![CDTD[]]> 導致文件格式錯亂,解析方案:Heredoc技術,如:
$S = <<<EOT ...... EOT;
XML文件上傳到遠程所遇到的問題:
上傳文件用的SFTP,即上傳文件完成後發現遠程伺服器上的文件數據並不完整,開發環境是正常的,測試環境上是不正常的,網上搜了些資料說每次上傳完成後,要手動的關閉下會話鏈接,這樣才會把緩存區的數據全部寫入到磁碟,用sftp_exec(session, 'exit);但測試後發現好像並沒能什麼用呢,最後決定上生產環境,跑了下數據發
現並沒有不完整。(在與環境做鬥爭。。)
頻繁的數據查詢導致的STMT_PREPARE問題:
即查詢頻率太大,最終的解決方案是每次都重新鏈接資料庫進行查詢。