日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

阅读鸟哥的风雪之隅PHP博客的笔记(1)

發布時間:2025/6/15 php 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 阅读鸟哥的风雪之隅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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。