在PC上PHP不会返回分配给curl频道的OS内存。
可以通过以下脚本进行检查:
<?php
$rss_cmd = " ps -o rss= -p ".posix_getpid();
echo "start: ".exec($rss_cmd).PHP_EOL;
$chs=[];
for ($i=0; $i<50000; $i++) {
$chs[]=curl_init();
}
echo "after init channels: ".exec($rss_cmd).PHP_EOL;
foreach ($chs as $ch) {
curl_close($ch);
}
echo "after close channels: ".exec($rss_cmd).PHP_EOL;
$chs=null;
unset($chs);
echo "after unset channels: ".exec($rss_cmd).PHP_EOL;
gc_collect_cycles();
echo "after init gc: ".exec($rss_cmd).PHP_EOL;
输出:
start: 25104
after init channels: 1191560
after close channels: 1193280
after unset channels: 1191236
after init gc: 1191236
正如我们所看到的,在关闭curl通道后仍然会分配内存。
但是当我在任何其他计算机上运行此脚本时,我有另一个结果:
start: 20060
after init channels: 1781244
after close channels: 69820
after unset channels: 67772
after init gc: 67772
造成这种差异的原因是什么?
PS 我用几个os和php版本检查它:ubuntu服务器16.04,ubuntu桌面16.04,ubuntu 17.10,Mac OS X,php 7.0,php 7.1,php 7.2,libcurl 7.55,libcurl 7.47
答案 0 :(得分:0)
这与PHP关系不大,而与操作系统如何管理应用程序分配的内存有关。
如果您在每次echo
来电后致电PHP memory_get_usage()
,您会发现PHP的内存使用量正在下降(因此内部释放资源)。
除非确实需要,否则内核不会立即重新声明以前为其他应用程序分配的内存。
即使它已经分配了一个程序free()
的内存,操作系统也可以选择将分配给该程序的内存留待以后再分配更多的内存,在这种情况下它只是将它返回给以前的实内存使用地址。