十、filesize緩存的問題
php
PHP的filesize竟然會緩存(固然還有很多,這裏僅用filesize舉例,其它會緩存的函數,以官方文檔爲準)
線上代碼常常隨機出各類問題,排查了1個月,線上加各類日誌,最終發現是filesize緩存的問題,以下代碼:mysql
看到了吧,filesize不只有緩存,並且還只緩存最後一個文件,因此說PHP的開發人員也不知道怎麼考慮的,就不會加個filesize_withcache方法?
知道了緣由,解決也就簡單了,在filesize調用前清除緩存,加代碼: clearstatcache()
參考官方文檔:http://php.net/manual/zh/function.filesize.php
linux
九、保存源碼文件時,注意要使用utf-8無bom簽名sql
以前用Windows的記事本編輯文件,發佈到Linux上線後,一直報錯:Cannot modify header information - headers already sent by (output started at xxx.php:1)
用Winmerge或BeyondCompare對比代碼也沒法發現問題,後來用Netbeans才發現文件最前面多了一個不可見字符,研究後才知道是Windows的Bom簽名
也就是說,在Windows上開發,在Linux上發佈,注意要使用不支持Bom的編輯器,若是用VisualStudio要選擇高級保存選項裏的不帶簽名centos
一、null和空、0、false等四個值的比較數組
在PHP中,== 會先進行類型轉換,再進行對比,而===會先比較類型,若是類型不一樣直接返回不相等,參考以下示例緩存
對於我這種之前只寫js或C#代碼的碼農,被這幾個值忽悠過n次,n大於3app
二、strrchr函數編輯器
在W3School站點上的註釋以下:函數
strrchr() 函數查找字符串在另外一個字符串中最後一次出現的位置,並返回從該位置到字符串結尾的全部字符。
若是成失敗,不然返回 false。
實際上,這個函數是查找某個字符,而不是查找字符串,應該參考官方文檔
代碼示例:
上面的代碼輸出是:.txt
也就是說,若是$b是字符串,只使用第一個字符,後面的其它字符會忽略
注:php提供了strstr函數,爲何不提供strrstr函數呢,雖然本身實現也很簡單
三、foreach裏的引用賦值,參見官方文檔
這個引用賦值很好哇,對用C#的我,在C#裏要修改foreach的元素,是不可能的,是會出異常滴,php把這個變成了可能,可是:
在官方文檔裏有一句警告:Warning 數組最後一個元素的 $value 引用在 foreach 循環以後仍會保留。建議使用 unset() 來將其銷燬。
咱們看一組代碼:
上面的代碼的輸出以下:
1,2,3,1,2,2 看最後一個輸出的是2,而不是3,就是由於代碼裏沒有銷燬$item形成的,緣由以下:
第一個循環,把3的引用賦給了$item,第二個循環,把1賦給了$item,由於$item是引用,致使數組的元素3變成了1,明白了嗎?
四、isset與empty的聯繫和區別,isset文檔 empty文檔
empty對以下8種狀況返回true:
null、 空串""、字符串0"0"、空array、布爾值false、數字0、浮點數0.0、類裏用var定義可是未賦值
isset 檢測變量是否設置,而且不是 NULL,可是對於empty的8種狀況,只有null返回false,其它7種狀況都返回true
綜上所述,除了empty描述的的非null的7種狀況,在其它狀況下, if(empty(變量)) 等效於 if(!isset(變量))
靈活用法一則:直接訪問 $arr['aaa'] 可能報錯,說aaa不存在,能夠用:
if(isset($arr['aaa']){ 操做代碼} 或 if(!empty($arr['aaa']){ 操做代碼}
五、trim函數遇到中文空格時,會亂碼
參考如上的代碼,輸出結果:
能夠看出:trim致使亂碼出現了,正則^(?:\s| )+|(?:\s| )+$ 能夠正常工做,而正則^[\s ]+|[\s ]+$卻編譯異常,緣由我還沒搜索到
六、intval在Windows和Centos上,最大值範圍不一樣
在centos上,intval轉換的最大值是9223372036854775807,
而在個人Win7x64+64位的php上,轉換最大值倒是2147483647,很是奇怪,手冊明明說64位系統都是9223372036854775807,
這麼大一坑啊,官方解釋php6如下在win上僅是測試版,不支持64位
七、MySQL字段類型爲varchar時,不能用where xx=123來檢索,會沒法利用索引
建議全部SQL的值都用單引號括起來,如:where xx='123',若是字段類型爲int,也能正確利用索引
八、執行SQL後不判斷返回值,或判斷邏輯錯誤:
$sql = 'insert into app_log(id) select 0 from dual where 1=2'; |
---|
$sql = 'insert into app_log(id) select 0 from dual where 1=2'; |
---|
上面的2段代碼應該改爲:
$sql = 'insert into app_log(id) select 0 from dual where 1=2'; |
---|
注意:mysql中,update a set name='123' where id=1;
若是id爲1的記錄,name已是123,那麼這條update語句的affected_rows()=0
原文連接:http://blog.csdn.net/youbl/article/details/41014367