阅读鸟哥的风雪之隅PHP博客的笔记(1)
2019獨角獸企業重金招聘Python工程師標準>>>
1.?在PHP中使用協程實現多任務調度
http://www.laruence.com/2015/05/28/3038.html
?
2.?Curl的毫秒超時的一個”Bug”
CentOS服務器上, 當你設置了小于1000ms的超時以后, curl不會發起任何請求, 而直接返回超時錯誤(Timeout reached 28).
原來, 這里面有一個坑, CURL默認的, 在Linux系統上, 如果使用了系統標準的DNS解析, 則會使用SIGALARM來提供控制域名解析超時的功能, 但是SIGALARM不支持小于1s的超時, 于是在libcurl 7.28.1的代碼中(注意中文注釋行):
int Curl_resolv_timeout(struct connectdata *conn,const char *hostname,int port,struct Curl_dns_entry **entry,long timeoutms) { ....... ....... #ifdef USE_ALARM_TIMEOUTif(data->set.no_signal)/* Ignore the timeout when signals are disabled */timeout = 0;elsetimeout = timeoutms;if(!timeout)/* USE_ALARM_TIMEOUT defined, but no timeout actually requested */return Curl_resolv(conn, hostname, port, entry);if(timeout < 1000) //如果小于1000, 直接超時返回/* The alarm() function only provides integer second resolution, so ifwe want to wait less than one second we must bail out already now. */return CURLRESOLV_TIMEDOUT; ........ <?phpcurl_setopt($ch, CURLOPT_NOSIGNAL, 1); ?>這樣就可以支持了。
在比較新的PHP版本中,CURLOPT_NOSIGNAL是默認啟用的,所以可以不用設置了。
可以純粹了解一下就行吧。
?
3.??PHP浮點數的一個常見問題的解答
關于PHP的浮點數, 我之前寫過一篇文章:?關于PHP浮點數你應該知道的(All ‘bogus’ about the float in PHP)
不過, 我當時遺漏了一點, 也就是對于如下的這個常見問題的回答:
? <?php$f = 0.58;var_dump(intval($f * 100)); //為啥輸出57 ?>為啥輸出是57啊? PHP的bug么?
我相信有很多的同學有過這樣的疑問, 因為光問我類似問題的人就很多, 更不用說bugs.php.net上經常有人問…
要搞明白這個原因, 首先我們要知道浮點數的表示,
計算機專業科班出身的我,表示理解這個并不難。
4.?PDOStatement::bindParam的一個陷阱
<?php $dbh = new PDO('mysql:host=localhost;dbname=test', "test");$query = <<<QUERYINSERT INTO `user` (`username`, `password`) VALUES (:username, :password); QUERY; $statement = $dbh->prepare($query);$bind_params = array(':username' => "laruence", ':password' => "weibo"); foreach( $bind_params as $key => $value ){$statement->bindParam($key, $value); } $statement->execute();?最后執行的確實下面的sql。
INSERT INTO `user` (`username`, `password`) VALUES ("weibo", "weibo");究其原因, 也就是bindParam和bindValue的不同之處, bindParam要求第二個參數是一個引用變量(reference).
解決方法:
?A. 不要使用foreach, 而是手動賦值
$statement->bindParam(":username", $bind_params[":username"]); //$value是引用變量了 $statement->bindParam(":password", $bind_params[":password"]);?B.?使用bindValue代替bindParam, 或者直接在execute中傳遞整個參數數組.
?
5.?Mcrypt響應慢的一個原因
<?php $dmcryptText = "This string was AES-256 / CBC / ZeroBytePadding encrypted.";$key = pack('H*', "bcb04b7e103a0cd8b54763051cef08bc55abe029fdebae5e1d417e2ffb2a00a3");# 顯示 AES-128, 192, 256 對應的密鑰長度: # #16,24,32 字節。 $key_size = strlen($key); echo "Key size: " . $key_size . ", key: $key\n"; //$size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB); //$iv = mcrypt_create_iv($size); //注意這里 $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); $iv = mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM); echo "Iv size: " . $iv_size . ", iv: $iv\n"; # 創建和 AES 兼容的密文(Rijndael 分組大小 = 128)# 僅適用于編碼后的輸入不是以 00h 結尾的# (因為默認是使用 0 來補齊數據) $ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $dmcryptText, MCRYPT_MODE_CBC, $iv); echo base64_encode($ciphertext) . "\n";這里的問題就在于/dev/random, 它的random pool依賴于系統的中斷來產生. 當系統的中斷數不足, 不夠產生足夠的隨機數, 那么嘗試讀取的進程就會等待, 也就是會hang住, 來看一個簡單的例子:
解決的辦法就是, 改用/dev/urandom, /dev/urandom也是一個產生隨機數的設備, 但是它不依賴于系統中斷.
Weibo上SAE的同學?@胥昕ops提供了一個不需要修改PHP代碼的解決方案:
胥昕ops: SAE 二三月份遇到的這個問題,一條命令秒殺此問題,
$ rngd -r /dev/urandom -o /dev/random -t 1
用urandom的結果填充entropy池子,這樣既保證了entropy池的數量,也保證了隨機性
然而, 為什么PHP使用/dev/random作為默認, 這是因為理論上來說, /dev/urandom在一定的情況下, 可能會被可預測(參看:?/dev/random), 所以一般上認為, /dev/urandom不如/dev/random安全.
后記, 大家看手冊, 一定也要看手冊下面的評論, 呵呵, 有很多東西在評論中, 是有提到的, 如下面這條評論, 來自mcrypt_create_iv:
?
6.?再一次, 不要使用(include/require)_once
關于使用include還是include_once(以下,都包含require_once), 這個討論很長了, 結論也一直有, 就是盡量使用include, 而不是include_once, 以前最多的理由的是, include_once需要查詢一遍已加載的文件列表, 確認是否存在, 然后再加載.
解釋的比較復雜,懶得解釋了,反正盡量少用。
排除這些技術因素, 我也一直認為, 我們應該使用include, 而不是include_once, 因為我們完全能做到自己規劃, 一個文件只被加載一次. 還可以借助自動加載, 來做到這一點.
你使用include_once, 只能證明, 你對自己的代碼沒信心.
?
7.?關于PHP的編譯和執行分離
這篇講得不是很詳細,我也沒有能夠重現出來,估計是我的打開方式不對,評論里面很多也是說不知道怎么apc_bin_load的,Google了半天還是沒有能夠解決,所以我就說服自己別去想了,估計也用不上。如果真的要用的話,那么試試Facebook的HHVM或者PHP7,估計效果也比這個強。
?
8.??請手動釋放你的資源(Please release resources manually)
?
?
?
轉載于:https://my.oschina.net/laiconglin/blog/690012
總結
以上是生活随笔為你收集整理的阅读鸟哥的风雪之隅PHP博客的笔记(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用struts2制作后台中的问题记录
- 下一篇: (三)构建模块——Web页面建设