在php.ini中设置memory_limit – 我可以使用所有可用的系统内存吗?

对不起,新手问题,但我有一个专用的虚拟服务器,我正在工作,有512MB的RAM内存。 我最近将memory_limit从128M的默认值更改为256M。 我有什么理由不想将这个问题一路追到512M?

我有什么理由不想将这个问题一路追到512M?

是的 – 首先是每个PHP进程 512MB。 你的stream程真的需要那么多吗?

我能想出来的一些原因还没有被涵盖:

  1. 设置一个高的限制只会鼓励笨拙的编程(我不能想象PHP将是最好的语言来select,如果你需要一枪一半的演出)

  2. 潜在的拒绝服务攻击(例如,如果你在内存中上传处理,并且用户知道,他们只会上传一些非常大的文件,并使服务器脱机 – 而不是你的服务器打到32/64 / 128M,它会一路打到512M)。 这是假设你没有其他的上传限制,没有首先命中。

  3. 你有一个虚拟服务器。 如果是OpenVZ / Virtuozzo,你不可能突破到512M以上,那么你的进程就会开始被杀死 – 速度很快。 Apache可能会脱机,尤其是在使用dso的时候。 这会把所有东西都放下来,直到重新启动。

  4. 你将不知道这是否会导致重大问题,直到一个开始浮出水面。 与更复杂的内存pipe理不同,PHP在开始时不会尝试分配这么多的内存。 它只是说,它会继续尝试, 直到你尝试使用比这更多,然后放弃。 对于你所知道的,首先你可能无法获得任何接近512MB的地方 – 所以你不能假定只是因为你已经重新启动了Apache,而且一切仍然正常,你没事。

  5. 假设你有一个需要512M内存的应用程序。 为什么还要为所有其他stream程设置限制? 您冒险为上述所有问题创造了上述问题。 使用标准安装,需要它的脚本(例如一个大型的cron作业)只能执行ini_set('memory_limit','512M'); 在PHP中,并提高它自己的限制。 这使所有其他进程“安全”

这是一些更低层次的原因:

  1. 您的整个虚拟服务器分配了512M。 为了保持服务器的运行,这必须被分成几个进程,比如(至less)

    • 克龙
    • 阿帕奇
    • MySQL或一些数据库服务器

    在你的总共512M内存中,不可能压缩所有这些其他进程和512M PHP进程。

  2. 最重要的是,内核会将未使用的内存优化成caching – 所以不小心有很高的限制,没有真正的原因会导致性能损失。

  3. 确认是否交换(使用topfree -mvalidation)。 如果你这样做,你的虚拟服务器将达到极限, 如果你没有交换,你的进程将被pipe理程序杀死。 无论哪种方式,你会看到一个性能问题。

所以,总而言之,我不会build议提高这样的全球限制

我相信你可以设置它。 这可能不是明智的,因为你的内核和其他进程也需要一些内存。 根据您的虚拟机所连接的存储types,您的系统也可能将其存储caching在内存中

运行应用程序的操作系统将始终需要内存。 如果你把它提高到超出可用范围,你可以find更多的应用程序交换到磁盘。