1. 關於php 位運算符的問題
這個涉及到系統底層,WEB開發中幾乎沒用到,知道下有這個東西就好了。底層的東西解釋總是簡單不了的。
變數在內存中的存放都是二進制數字。整數在32位系統上是佔用4位元組,一個位元組是8位,也就是32位,位運算就是位級的運算操作了。
$a << $b Shift left(左移) 將 $a 中的位向左移動 $b 次(每一次移動都表示「乘以 2」)。
假定變數 $a 的值是 3,$b 的值是 2。
那麼 $a 在內存中的存放的格式是:
00000000 00000000 00000000 00000011
每執行一次左移,都將所有的位向左移動,右邊補零,左邊超過的舍棄。
所以 $a 左移 2 得到的是:
00000000 00000000 00000000 00011000
也就是 12。相當於 3 × 2 × 2 = 12。
$a >> $b Shift right(右移) 將 $a 中的位向右移動 $b 次(每一次移動都表示「除以 2」)。
假定變數 $a 的值是 24,$b 的值是 2。
那麼 $a 在內存中的存放的格式是:
00000000 00000000 00000000 00011000
每執行一次右移,都將所有的位向由移動,右邊超過的舍棄,左邊空出的位補零。
所以 $a 右移 2 得到的是:
00000000 00000000 00000000 00000110
也就是 6。相當於 24 ÷ 2 ÷ 2 = 6。
位移運算是系統底層運算,運算的速度比乘除還要快很多,優化代碼優化到極致的時候,可以將數換算成二的公倍數,然後進行位移計算。但在WEB開發中幾乎沒有任何必要,而且超過系統底層了,程序在的可移植性就會降低。
其他的位運算符也是差不多的。比如:
$a & $b And(按位與) 將把 $a 和 $b 中都為 1 的位設為 1。
假定變數 $a 的值是 5,$b 的值是 6。
$a:
00000000 00000000 00000000 00000101
$b:
00000000 00000000 00000000 00000110
$a & $b :
00000000 00000000 00000000 00000101
00000000 00000000 00000000 00000110
───────────────────────────
00000000 00000000 00000000 00000100
豎的看,上下都是 1 的得到 1 ,否則就是 0。
所以 $a & $b = 4。
~ $a Not(按位非) 將 $a 中為 0 的位設為 1,反之亦然。
~ $a:
00000000 00000000 00000000 00000101
───────────────────────────
11111111 11111111 11111111 11111010
如果 $a 是有符號整數,第一位是符號位,1表示負數,那麼 ~ $a = -2147483642。
如果 $a 是無符號整數,第一位還是數據位,那麼 ~ $a = 4294967290。
以下的就不詳細介紹了:
$a | $b Or(按位或) 將把 $a 或者 $b 中為 1 的位設為 1。
$a ^ $b Xor(按位異或) 將把 $a 和 $b 中不同的位設為 1。
平常說的幾位的系統,就是系統處理整數的時候,是多少個位同時計算的,上面的例子都是基於32位系統。因為移動時超過的位將被舍棄,如果是64位或12位的,位移的結果就可能不一樣了,要將計算時位的數量調整下。
2. 修改PHP ini_set內存限制(只對寫入的文件有效)
在進行PHP編程時,如果需要調整內存限制以適應特定任務或需求,可以對`memory_limit`配置進行修改。默認情況下,`memory_limit`的值可能限制了程序運行時可用的內存大小。對於只對寫入文件的操作有效的情況,調整此配置有助於提升性能或處理大型文件。
首先,了解`memory_limit`配置的作用非常重要。它指定了腳本執行期間允許使用的最大內存(以位元組為單位)。例如,`memory_limit`設置為512M表示腳本最多可以使用512MB的內存。
調整`memory_limit`的步驟如下:
1. 打開包含需要執行的代碼的PHP文件。在這個例子中,文件路徑是`core\class\io\io_dzz.php`。確保你有文件的編輯許可權。
2. 查找`memory_limit`配置。通常,這種配置會在腳本的開始部分,或者在執行可能需要大量內存的函數或操作之前進行定義。調整代碼以去除或修改`memory_limit`的設置。例如,你可以刪除`@ini_set("memory_limit", "512M");`這一行,或者修改為`ini_set("memory_limit", "1G");`來設置為1GB的內存限制。
3. 保存文件並重新運行腳本。在執行過程中,你將注意到內存限制已經調整,這將對腳本執行過程中的內存使用產生影響。對於寫入文件的操作,更大的內存限制可能允許你處理更大型或復雜的文件。
記住,調整`memory_limit`需要謹慎行事,因為它可能會對程序的性能和資源使用產生重大影響。確保在修改後測試腳本,以確保它仍然符合預期,並且沒有產生任何錯誤或異常行為。
3. php如何將圖片轉成位元組流
在php中,有文件上傳,那麼php伺服器端可以接收到請求參數 $_FILES,在 $_FILES數組中讀取到上傳文件的form表單名,然後在讀取的數組中可以獲取上傳文件的源文件,使用 fopen()函數就可以獲取文件的位元組流了。
具體來點代碼看看吧:(假定上傳文件的表單名為 「formname」)
if($_FILES && isset($_FILES["formname"])){
//獲取上傳的文件的屬性數組
$_fileinfo = $_FILES["formname"];
//獲取上傳文件的原文件名
$_filename = $_fileinfo["name"];
//獲取上傳文件的大小
$_filesize = $_fileinfo["size"];
//獲取上傳文件的臨時文件名(長文件名)
$_filesource = $_fileinfo["tmp_name"];
//以讀寫方式打開文件,並將資源綁定到一個流上
$_filestream = fopen($_filesource,"ab");
//實現上傳文件,其實質是把臨時文件移動到制定的保存文件的位置
$_newfilename = "../mypath/filename.exp"; //自定義文件名,包含路徑,可以是相對路徑
move_uploaded_file($_filesource, $_newfilename);
}
4. PHP如何將從二進制文件中讀取的位元組轉換為數字
bindec函數可轉換二進制數為十進制數
5. php怎麼把位元組轉換MB
function sizecount($filesize) {
if($filesize >= 1073741824) {
$filesize = round($filesize / 1073741824 * 100) / 100 . ' gb';
} elseif($filesize >= 1048576) {
$filesize = round($filesize / 1048576 * 100) / 100 . ' mb';
} elseif($filesize >= 1024) {
$filesize = round($filesize / 1024 * 100) / 100 . ' kb';
} else {
$filesize = $filesize . ' bytes';
}
return $filesize;
}
//應用方法
$path='./111cn.net/a.gif';
echo sizecount(filesize($path));