这篇文章已经收录了编程学习笔记。涵盖PHP、JavaScript、Linux、Golang、MySQL、Redis、开源工具等。生产环境中使用的PHP需要进行优化,让PHP有更好的表现。除了编写PHP代码,还需要配置php-fpm和php.ini调优。本文从内存、OPcache、上传、session、安全等方面讲解php.ini的配置调优。与其他编译型语言相比,PHP最大的缺点就是每次请求都会做一些模块解析,真正执行的是工作进程。工作进程的启动需要消耗更多的资源。同时,每次请求都会重新解析一些代码,导致重复解析。对于PHP的优化,可以从这方面着重考虑优化。内存优化在运行PHP时,需要关心每个PHP进程使用多少内存。php.ini中的memory_limit设置用于设置单个PHP进程可以使用的最大系统内存。该设置的默认值为128M,可能适合大多数中小型PHP应用程序。但是,如果您运行的是小型PHP应用程序,则可以减小此值以节省系统资源。相反,如果您运行的是内存密集型的PHP应用程序,则可以增加此值。该值的大小由可用的系统内存决定。确定分配给PHP的价值是一门艺术。在决定给PHP分配多少内存以及PHP-FPM进程能够承受多少时,可以根据以下维度信息进行判断:PHP可以分配多少内存?以2G内存的VPS为例。这个设备上可能还有其他进程在运行,比如MySQL、Nginx等,所以预留512M给PHP比较合适。每个PHP进程平均消耗多少内存?要监控进程的内存使用情况,可以使用命令行命令top,也可以在PHP脚本中调用memory_get_peak_usage()函数。无论使用哪种方法,都必须多次运行同一个脚本,然后取内存消耗的平均值。.你能负担得起多少PHP-FPM进程?假设我给PHP分配了512M内存,每个PHP进程平均消耗15M内存,那么我可以负担得起34个PHP-FPM进程。是否有足够的系统资源?最后,您需要确认有足够的系统资源来运行PHP应用程序并处理预期的流量。具体的PHP配置信息请参考php-fpm.config配置文件。;子进程等待对来自主进程的信号作出反应的时间限制。可用单位:s(秒)、m(分)、h(我们的)或d(天);默认单位:秒;默认值:0;process_control_timeout=0;FPM将fork的最大进程数。这是为了控制;在大量池中使用动态PM时的全局进程数。谨慎使用。注:值为0表示没有限制;默认值:0;process.max=128;指定应用到主进程的nice(2)优先级(仅当设置时);该值可以从-19(最高优先级)到20(最低优先级)变化;注意:-只有当FPMmaster进程以root身份启动时它才会起作用;-pool进程会继承master进程的优先级;除非另有说明;默认值:无设置;process.priority=-19;将FPM发送到后台。设置为“否”以将FPM保持在前台进行调试。默认值:yesdaemonize=nophp-fpm有三种运行模式,分别是固定进程数、按需进程数和全动态按需进程数。默认初始化进程数。如果传入的进程数太大,则会动态创建一些新的进程数。请求结束后,新创建的进程数正在被销毁。进程数是固定的,默认固定几个进程。如果进程数不够,则等待新的请求,直到其他进程处理完后,才会处理新的请求。全动态进程的数量意味着它完全受请求量的控制。一个请求创建一个进程,处理完成后销毁。开启ZendOPcache性能加速在确定分配多少内存后,您可以配置PHP的ZendOPcache扩展。OPcache主要是将一些代码解析成字节码,所以在后续的请求中不需要重复解析和编译这部分代码。减少编译和解析的过程也可以提高PHP的处理速度。PHP5.5.0+内置此扩展,必要的配置信息如下:opcache.memory_consumption=64:为opcode缓存分配的内存(以MB为单位),分配的内存应能保存所有PHP脚本编译在application获得的opcode,这个值可以根据应用的体量设置成不同的值。opcache.interned_strings_buffer=16:用于存储驻留字符串的内存量(以MB为单位)。什么是常驻字符串?在幕后,PHP解释器将找到同一字符串的多个实例并将该字符串存储在内存中。如果再次使用相同的字符串,PHP解释器将使用一个指针来节省内存。默认情况下,PHP驻留字符串在每个PHP进程中都是隔离的。该设置允许PHP-FPM进程池将所有进程常驻字符串存储在一个共享缓冲区中,这样PHP-FPM进程池中的多个进程引用常驻字符串,可以节省更多的内存。opcache.max_accelerated_files=4000:操作码缓存中可以存储的PHP脚本的最大数量。该值的范围在2000到100000之间。该值必须大于PHP应用程序中的文件数。opcache.validate_timestamps=1:当该设置的值为1时,PHP会在一段时间后检查PHP脚本的内容是否发生变化,检查间隔由opcache.revalidate_freq设置指定。如果这个设置的值为0,PHP将不会检查PHP脚本的内容是否有变化,我们必须自己清除缓存的操作码。建议开发环境设置为1,生产环境设置为0。opcache.revalidate_freq=0:设置多久(以秒为单位)检查PHP脚本内容是否已更改。设置为0秒的意思是只有当opcache.validate_timestamps设置为1时,PHP文件才会在每次请求时重新生效,所以在开发环境中每次都会重新生效PHP文件,而在生产环境中则不会验证.opcache.fast_shutdown=1:此设置允许操作码使用更快的关闭步骤,将对象销毁和内存释放留给ZendEngine的内存管理器。文件上传如果您的应用程序允许文件上传,最好设置可以上传的最大文件大小。另外,最好设置一下可以同时上传的最大文件数:file_uploads=1upload_max_filesize=10Mmax_file_uploads=3PHP默认允许一次请求上传20个文件,最大上传文件大小是2MB。这里我设置了单次请求最多只能上传3个文件,每个文件最大10MB。这个值不要设置太大,否则会超时。注意:如果需要上传大文件,需要相应调整Web服务器的配置。除了在php.ini中设置外,还要调整Nginx虚拟主机配置中的client_max_body_size设置。另外,如果你上传的是非常大的文件,我推荐使用Webuploader的专用上传组件。前端对大文件进行切片,后端php合并切片后的数据,还原文件。WebUploader的应用请参考本站文章:强大的文件上传组件-WebUploader。执行时间max_execution_time用于设置单个PHP进程在被终止之前可以运行的最长时间。此设置默认为30秒,建议设置为5秒:max_execution_time=5在PHP脚本中,可以调用set_limit_time()函数来覆盖此设置。假设我们要生成一份报告,并将结果制作成PDF文件。这个任务可能需要10分钟才能完成,我们当然不想让PHP请求等待10分钟。我们应该编写一个单独的PHP文件,让它在单独的后台运行In-processexecution,webapplication可以在几毫秒内fork一个单独的后台进程并返回一个HTTP响应。事实上,我们在运行需要大量时间才能完成的任务,一般采用后台进程的方式。比如我们可以使用PHP的swoole扩展来生成报表,批量发送邮件。处理sessionPHP默认的情况是将session产生的信息存储在磁盘上,比如所谓的session信息。在创建和读取session时,都会对磁盘进行I/O操作,而读写磁盘实际上是一个耗时的操作。而且session不方便分布式应用的session机制处理。推荐放在Redis、memcached等内存服务中,读写速度快,可以采用分布式session机制处理。下面的例子将session等信息存储在memcached内存中。session.save_handler="memcached"session.save_path="服务地址:端口号"如果缓冲区用更少的块发送更多的数据而不是用更多的块发送更少的数据,那么网络会更有效率,即传递内容以更少的片段传送到访问者的浏览器,从而减少了HTTP请求的总数。因此,我们需要让PHP缓冲输出。默认情况下,PHP已启用输出缓冲。PHP在将内容发送到Web服务器之前缓冲4096字节的输出。推荐配置如下:output_buffering=4096implicit_flush=false如果要修改输出缓冲区的大小,请确保使用的值是4(32位系统)或8(64位系统)的倍数。安全设置open_basedir:使用open_basedir选项控制PHP脚本只访问指定目录,可以防止PHP脚本访问不该访问的文件,一定程度上限制phpshell的危害。我们一般可以设置为只访问网站目录:open_basedir=/data/wwwdisable_functions:一般我们要禁止系统功能,禁止对任何文件和目录的操作,如:disable_functions='.....'expose_php=Off:设置此项如果设置为false,则不会在header中输出PHP版本信息。display_errors=Off:在生产环境中,我们应该关闭错误提示。如果是本地开发环境,可以设置为On。log_errors=On:建议关闭display_errors后记录错误信息,以便查找服务器运行的原因。error_log:设置存放PHP错误日志的目录。
