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));