Articles of PHP

debugging卡住生产服务器上的Apache / PHP线程

我有一个Linux系统与Apache的httpd和PHP使用LoadModule php5_module /usr/lib/apache2/modules/libphp5.so加载。 我已经启用了Apache的mod_status模块,我看到一个特定的线程,从昨天开始就停滞不前。 我也通过做ps -axu | grep apache证实这一点 在许multithreading中,它给了我特定的卡住的线程: www-data 5636 0.0 0.1 423556 23560 ? S XXXXX 0:04 /usr/sbin/apache2 -k start 请注意,XXXXX就像昨天的Jan02一样。 另外,pid(5636)与我在apache的mod_status页面中看到的卡住线程的pid匹配。 我的问题是:我怎么能做一个线程转储或类似的东西,看看在哪里确切地在PHP代码中卡住这个东西? 也许它正在等待(I / O,networking,数据库),但我不知道是什么。 在java世界中,我会做一个kill -3 pid并获得一个可读的线程转储,清楚地显示出特定线程在哪里被卡住。 有没有类似的技术的PHP土地?

php cli额外的.ini文件未加载

我已经编译了PHP 5.3,除了从命令行运行PHP时,一切似乎都正常工作。 当我运行: # php –ini 它产生这个输出: Configuration File (php.ini) Path: /etc/php5/apache2 Loaded Configuration File: /etc/php5/apache2/php.ini Scan for additional .ini files in: (none) Additional .ini files parsed: (none) 当我创build一个页面并输出phpinfo(); 我得到这个输出: Configuration File (php.ini) Path: /etc/php5/apache2 Loaded Configuration File: /etc/php5/apache2/php.ini Scan for additional .ini files in: /etc/php5/apache2/conf.d Additional .ini files parsed: /etc/php5/apache2/conf.d/curl.ini, /etc/php5/apache2/conf.d/gd.ini, /etc/php5/apache2/conf.d/imagick.ini, /etc/php5/apache2/conf.d/memcache.ini, /etc/php5/apache2/conf.d/mhash.ini, […]

在哪里设置“PHP_FCGI_MAX_REQUESTS”(lighttpd)

我想设置最大的请求,以防止内存泄漏时我的系统内存不足。 但我不知道它在哪里。

处理程序for(null)返回无效结果代码70007 /导致错误500?

我得到这些错误在我的网站(PHP / Apache / Linux / MySQL的VPS)的一些页面间隔,似乎无法find任何可重复的情况: (null)的处理程序返回了无效的结果代码70007 要么 (null)处理程序返回无效的结果代码70014 它主要发生在完成文件(图像)上传的页面上。 然后它会导致500错误。 谷歌还没有回报任何结论,有没有人遇到这些错误?

为什么在一个从php进程运行的进程中不会触发一个报警处理程序?

我没有太多的PHP / mod_phppipe理经验,所以我很抱歉,如果这是一个非常简单的问题。 我的问题是 – 为什么不能通过exec()调用从PHP脚本产生的进程正确接收报警中断? 我的问题的长版: 今天早上,我在一个现有的PHP脚本中递交了一个bug。 经过一番调查,我已经把它追溯到php正在使用exec()来运行一个subprocess的事实,subprocess依靠一个SIGALRM来逃避一个循环,并且它从来没有收到警报。 我不认为这很重要,但具体的subprocess是/ bin / ping。 当ping一个不返回任何数据包的设备时(例如一个带有放弃ICMP回应请求而不是返回目标主机不可达的防火墙的设备),你必须使用-w选项来设置一个定时器来允许程序退出(因为-c计数返回数据包 – 如果目标永远不会返回数据包,并且不使用-w,则会陷入无限循环)。 当从PHP调用时, ping -w依赖的警报处理程序不会触发。 这里有一些有趣的使用strace来跟踪从命令行(警报处理程序工作)的ping调用: (snip) setitimer(ITIMER_REAL, {it_interval={0, 0}, it_value={1, 0}}, NULL) = 0 (snip) — SIGALRM (Alarm clock) @ 0 (0) — rt_sigreturn(0xe) = -1 EINTR (Interrupted system call) 当我插入一个shell包装,允许我从网上调用时运行strace,我发现setitimer调用存在(并似乎运行成功),但SIGALRM行和rt_sigreturn()行不当下。 ping然后继续运行sendmsg()和recvmsg(),直到我手工杀死它。 试图减lessvariables,然后我把它切出来,写下面的Perl: [jj33@g3 t]# cat /tmp/toperl #!/usr/bin/perl $SIG{ALRM} = […]

无法让PHP停止显示错误

相反,大多数人的问题我不能让PHP停止显示错误,我已经在我的php.ini display_errors设置为closures,但它仍然显示他们,我也试过.htaccess,并内联ini_set和error_reportingvariables,但错误仍然显示。 我能做些什么来防止这种情况的发生? Mac OS X Lion Server 10.7.1 MAMP使用DIY Mac服务器(diymacserver.com) 更新: 这是我的php.ini文件存储的地方… 这是我在运行时的display_errors设置的值 这是在/etc/php.ini中写入的复制和粘贴值 display_errors = Off

确保守护进程是安全的

所以我想知道,我们应该采取哪些步骤来确保PHP守护进程是安全的? 我读到的一个事情是分配守护进程作为一个有限priveleges用户运行? 但是我们怎么能在UNIX上做到这一点? 我猜测使用useradd函数,但我们如何确保用户ADDED具有有限的权限? 当涉及到PHP守护进程时,我们还应该采取哪些其他步骤来提高安全性? 编辑:我使用Centos 5.5(Linux)

共享主机的PHP-FPM和APC?

我们正在研究如何让APC只为每个帐户/站点创build一个caching。 这可以通过Fastcgi完成(最新更新为2006年…),但Fastcgid APC将不得不为同一个帐户运行的多个进程创build多个caching。 为了解决这个问题,我们一直在研究PHP-FPM PHP进程pipe理器允许多个PHP进程共享一个APCcaching。 但是从我读过的东西(我希望我错了),即使您为每个进程创build一个池,跨所有池的所有站点将共享相同的APCcaching。 这使我们回到与共享Memcached相同的问题:这是不安全的! 在php-fpm的网站上,我读到,你可以chroot php-fpm池,并定义一个特定的UID和每个池的GID …如果是这样的话,APC不得不使用这个用户,并没有访问其他池caching? 这里的一篇文章(在2011年)提出,你需要在每个池上运行一个进程,在不同的端口上创build多个启动器,并且每个configuration文件为一个池创build不同的configuration文件: http://groups.drupal.org/node/198168 这是否仍然是必需的? 如果是这样的话,那么运行php-fpm的800个进程会有什么影响呢? 会主要是记忆吗? 如果是的话,我怎样才能算出记忆的影响呢? 我想,运行800次php-fpm会更好,然后让帐户为单个站点创build多个APCcaching? 如果平均一个帐户创build一个50MBcaching,并创build3个caching每个帐户,使150Mb每个帐户,使120GB … 但是,如果每个帐户使用平均只有50Mb,将使40GB 我们的下一台服务器至less有128GB内存,如果运行800x PHP-FPM不会产生20GB以上的开销,那么40GB是可以接受的! 你认为什么是PHP-FPM最好的方式去提供安全的APCcaching共享主机与具有相当数量的内存的服务器? 或者我应该看看另一个系统? 谢谢 !

用nginx防止大file upload

我使用Nginx作为Web服务器来服务我的网站。 我提供上传function给我的用户(他们被允许提交图片高达5Mb),所以我有指令: client_max_body_size 5M; 在我的服务器configuration。 我注意到的是,如果我尝试上传任何文件,Web服务器不会阻止上传更大的文件。 举个例子,假设我试图上传一个700Mb的真正大的video(电影)。 服务器不会立即拒绝上传,但会缓冲整个数据(花费太长时间并减慢服务器速度),只有在上传结束时才会返回一个413 Request entity too large错误。 所以问题是:有没有办法正确configurationNginx阻止大file upload时,传输的数据开始克服我的client_max_body_size限制? 我认为用我的实际设置进行生产会非常不安全,而且我无法在Google上find任何有用的信息。 编辑: 我使用PHP和Symfony2作为后端… 编辑(再次): 这是我的error.log中显示的内容: 2013/01/28 11:14:11 [error] 11328#0: *37 client intended to send too large body: 725207449 bytes, client: 33.33.33.1, server: www.local.example.com, request: "POST /app_dev.php/api/image/add/byuploader HTTP/1.1", host: "local.example.com", referrer: "http://local.example.com/app_dev.php/"` 奇怪的是,我正在用tail -f error.log监视我的nginx error.log ,并且在上载开始时(在结束之前)立即出现消息。 所以nginx做了一些预防性的检查,但是不会停止/块化上传请求… 我也试图validation,如果PHP通过发出echo 'something'; die();得到上传的控制echo 'something'; […]

php-fpm错误的文件描述符错误

我使用php-fpm与客户分开的池。 有时页面是冻结的,然后显示500内部服务器错误,并在错误日志中得到这样的错误: [11-Feb-2013 22:12:39] ERROR: unable to read what child say: Bad file descriptor (9) [11-Feb-2013 22:12:39] ERROR: unable to read what child say: Bad file descriptor (9) [11-Feb-2013 22:12:42] WARNING: [pool oferty] child 31186 exited on signal 11 (SIGSEGV) after 198.250454 seconds from start 我目前的设置是: [admin] listen = 127.0.0.1:51006 listen.backlog = -1 listen.allowed_clients = […]