Rumah > Artikel > pembangunan bahagian belakang > Bagaimana untuk mengoptimumkan PHP untuk meningkatkan konkurensi tinggi?
PHP yang digunakan dalam persekitaran pengeluaran perlu dioptimumkan untuk membolehkan PHP sendiri berprestasi lebih baik Selain menulis kod PHP, anda juga mesti mengkonfigurasi penalaan php-fpm dan php.ini. Artikel ini menerangkan penalaan konfigurasi php.ini dari aspek memori, OPcache, muat naik, sesi dan keselamatan.
Berbanding dengan bahasa yang disusun lain, kelemahan terbesar PHP ialah setiap permintaan akan melakukan beberapa penghuraian modul, dan apa yang sebenarnya dilaksanakan ialah proses kerja. Memulakan proses kerja memerlukan lebih banyak sumber. Pada masa yang sama, setiap permintaan akan menghuraikan semula beberapa kod, menghasilkan penghuraian berulang.
Untuk pengoptimuman PHP, anda boleh menumpukan pada aspek ini untuk mempertimbangkan pengoptimuman.
Apabila menjalankan PHP, anda perlu mengambil berat tentang jumlah memori yang digunakan oleh setiap proses PHP Tetapan memory_limit
dalam php.ini digunakan untuk menetapkan satu proses PHP. Jumlah maksimum memori sistem yang boleh digunakan.
Nilai lalai tetapan ini ialah 128M, yang mungkin sesuai untuk kebanyakan aplikasi PHP bersaiz kecil dan sederhana Namun, jika anda menjalankan aplikasi micro-PHP, anda boleh menurunkan nilai ini untuk menjimatkan sumber sistem . Sebaliknya, jika anda menjalankan aplikasi PHP intensif memori, anda boleh meningkatkan nilai ini. Saiz nilai ini ditentukan oleh memori sistem yang tersedia. Menentukan berapa banyak nilai untuk diperuntukkan kepada PHP adalah seni Apabila memutuskan berapa banyak memori untuk diperuntukkan kepada PHP dan berapa banyak proses PHP-FPM yang mampu, ia boleh dinilai berdasarkan. pada maklumat dimensi berikut:
Berapa banyak memori boleh diperuntukkan kepada PHP? Ambil VPS dengan memori 2G sebagai contoh Peranti ini juga boleh menjalankan proses lain, seperti MySQL, Nginx, dll., jadi adalah wajar untuk meninggalkan 512M untuk PHP.
Berapa banyak memori yang digunakan setiap proses PHP secara purata? Untuk memantau penggunaan memori proses, anda boleh menggunakan arahan baris arahan top
, atau anda boleh memanggil fungsi memory_get_peak_usage()
dalam skrip PHP Tidak kira kaedah yang digunakan, anda mesti menjalankan skrip yang sama beberapa kali dan kemudian ambil nilai purata penggunaan memori.
Berapa banyak proses PHP-FPM yang anda mampu bayar? Katakan saya memperuntukkan memori 512M kepada PHP dan setiap proses PHP menggunakan purata memori 15M, maka saya mampu membeli 34 proses PHP-FPM.
Adakah sumber sistem mencukupi? Akhir sekali, anda perlu mengesahkan bahawa terdapat sumber sistem yang mencukupi untuk menjalankan aplikasi PHP dan mengendalikan trafik yang dijangkakan. Untuk maklumat konfigurasi PHP khusus, sila rujuk fail konfigurasi php-fpm.config.
; Time limit for child processes to wait for a reaction on signals from master. ; Available units: s(econds), m(inutes), h(ours), or d(ays) ; Default Unit: seconds ; Default Value: 0 ;process_control_timeout = 0 ; The maximum number of processes FPM will fork. This has been designed to control ; the global number of processes when using dynamic PM within a lot of pools. ; Use it with caution. ; Note: A value of 0 indicates no limit ; Default Value: 0 ; process.max = 128 ; Specify the nice(2) priority to apply to the master process (only if set) ; The value can vary from -19 (highest priority) to 20 (lowest priority) ; Note: - It will only work if the FPM master process is launched as root ; - The pool process will inherit the master process priority ; unless specified otherwise ; Default Value: no set ; process.priority = -19 ; Send FPM to background. Set to 'no' to keep FPM in foreground for debugging. ; Default Value: yes daemonize = no
php-fpm mempunyai tiga mod operasi, iaitu bilangan proses tetap, bilangan proses atas permintaan dan bilangan proses dinamik sepenuhnya.
Bilangan proses atas permintaan Beberapa proses dimulakan secara lalai Jika jumlahnya terlalu besar, beberapa proses baharu akan dibuat secara dinamik Selepas permintaan selesai, proses yang baru dibuat akan musnah.
Betulkan bilangan proses Secara lalai, beberapa proses ditetapkan Jika bilangan proses tidak mencukupi, permintaan baharu akan menunggu dan tidak akan diproses sehingga proses lain selesai selesai diproses.
Bilangan proses dinamik sepenuhnya bermakna ia dikawal sepenuhnya oleh jumlah permintaan Satu proses dibuat untuk setiap permintaan dan dimusnahkan selepas pemprosesan.
Selepas menentukan jumlah memori yang perlu diperuntukkan, anda boleh mengkonfigurasi sambungan Zend OPcache PHP. OPcache terutamanya menghuraikan beberapa kod ke dalam bytecode, jadi tidak perlu menghuraikan dan menyusun bahagian kod ini berulang kali dalam permintaan seterusnya. Mengurangkan proses penyusunan dan penghuraian juga boleh meningkatkan kelajuan pemprosesan PHP.
PHP5.5.0 mempunyai sambungan terbina dalam ini Berikut adalah beberapa maklumat konfigurasi yang diperlukan:
opcache.memory_consumption = 64
: Memori yang diperuntukkan untuk cache opcode (unit ialah MB), jumlah yang diperuntukkan. memori Ia sepatutnya boleh menyimpan opcode yang disusun oleh semua skrip PHP dalam aplikasi Nilai ini boleh ditetapkan kepada saiz yang berbeza mengikut saiz aplikasi.
opcache.interned_strings_buffer = 16
: Jumlah memori yang digunakan untuk menyimpan rentetan pemastautin (unit ialah MB Apakah rentetan pemastautin? Di sebalik tabir, jurubahasa PHP akan mencari beberapa contoh rentetan yang sama dan menyimpan rentetan dalam ingatan Jika rentetan yang sama digunakan semula, jurubahasa PHP akan menggunakan penunjuk. Secara lalai, rentetan pemastautin PHP akan diasingkan dalam setiap proses PHP Tetapan ini membenarkan kumpulan proses PHP-FPM menyimpan semua rentetan pemastautin proses dalam penimbal dikongsi supaya ia boleh diproses dalam rentetan proses PHP-FPM dirujuk antara pelbagai proses, yang menjimatkan lebih banyak memori.
opcache.max_accelerated_files = 4000
: Bilangan maksimum skrip PHP yang boleh disimpan dalam cache opcode Julat nilai ini adalah antara 2000 dan 100000. Nilai ini mestilah lebih besar daripada bilangan fail dalam aplikasi PHP. .
opcache.validate_timestamps = 1
: Apabila nilai tetapan ini ialah 1, PHP akan menyemak sama ada kandungan skrip PHP telah berubah selepas tempoh masa semakan ditentukan oleh tetapan opcache.revalidate_freq. Jika nilai tetapan ini ialah 0, PHP tidak akan menyemak sama ada kandungan skrip PHP telah berubah, dan kami mesti mengosongkan opcode yang dicache sendiri. Adalah disyorkan untuk menetapkannya kepada 1 dalam persekitaran pembangunan dan 0 dalam persekitaran pengeluaran.
opcache.revalidate_freq = 0
:设置多久(单位是秒)检查一次 PHP 脚本内容是否有变化。设置为0秒的含义是仅当opcache.validate_timestamps设置为1时,才会在每次请求时都重新验证 PHP 文件,因此,在开发环境中每次都会重新验证 PHP 文件,在生产环境中则不验证。
opcache.fast_shutdown = 1
:这么设置能让操作码使用更快的停机步骤,把对象析构和内存释放交给 Zend Engine 的内存管理器完成。
如果你的应用允许上传文件,最好设置最大能上传的文件大小。除此之外,最好还要设置最多能同时上传多少个文件:
file_uploads = 1 upload_max_filesize = 10M max_file_uploads = 3
默认情况下,PHP 允许在单次请求中上传 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 文件,让其在单独的后台进程中执行,Web 应用只需几毫秒就可以派生一个单独的后台进程,然后返回 HTTP 响应。
实际上,我们在跑需要消耗大量时间来完成的任务,一般采用后台进程方式,比如我们可以使用PHP的swoole扩展来生成报表、批量发送邮件耗时长的任务。
PHP默认的情况是将会话产生的信息存在磁盘中,例如所谓的session信息。在创建和读取session时,都会对磁盘进行I/O操作,读写磁盘其实是比较耗时的一个操作。并且session不方便做分布式应用的会话机制处理。推荐可以放在Redis、memcached这样的内存性服务中,读写速度快,并且可以做分布式会话机制处理。
下面举例将session这样的信息,存储在memcached内存中。
session.save_handler = "memcached" session.save_path = "服务地址:端口号"
如果是在较少的块中发送更多数据,而不是在较多的块中发送较少的数据,那么网络的效率会更高,也就是说,在较少的片段中把内容传递给访问者的浏览器,能减少 HTTP 请求总数。
因此,我们要让 PHP 缓冲输出,默认情况下,PHP 已经启用了输出缓冲功能,PHP 缓冲 4096 字节的输出之后才会把内容发送给 Web 服务器,推荐配置如下:
output_buffering = 4096 implicit_flush = false
如果想要修改输出缓冲区的大小,确保使用的值是4(32位系统)或8(64位系统)的倍数。
open_basedir
:使用open_basedir选项能够控制PHP脚本只能访问指定的目录,这样能够避免PHP脚本访问不应该访问的文件,一定程度上限制了phpshell的危害。我们一般可以设置为只能访问网站目录:
open_basedir = /data/www
disable_functions
:一般我们要禁止系统函数和禁止任何文件和目录的操作,如:
disable_functions = '.....'
expose_php = Off
:将此项设置为false即不会再header头输出PHP版本信息。
display_errors = Off
:生产环境中,我们应该禁止错误提示,如果是本地开发环境,可以设置为On。
log_errors = On
:建议在关闭display_errors后能够把错误信息记录下来,便于查找服务器运行的原因。
error_log
:设置PHP错误日志存放的目录。
推荐学习:《PHP视频教程》
Atas ialah kandungan terperinci Bagaimana untuk mengoptimumkan PHP untuk meningkatkan konkurensi tinggi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!