php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #52075 php -b 127.0.0.1 vs php -y php-fpm.conf -x
Submitted: 2010-06-13 13:38 UTC Modified: 2010-06-17 04:47 UTC
From: luk-4u at hotmail dot com Assigned: fat (profile)
Status: Closed Package: FPM related
PHP Version: 5.2.13 OS: ubuntu 9.04
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: luk-4u at hotmail dot com
New email:
PHP Version: OS:

 

 [2010-06-13 13:38 UTC] luk-4u at hotmail dot com
Description:
------------
As starting php-cgi in 2 ways, the 2 results were different. 
1./path/to/php-cgi -b 127.0.0.1:9000
2./path/to/php-cgi -y /path/to/php-fpm.conf -x 

The first one was correct.
The second, which said: 'No input file specified'.

As i tracked down the c code, i found out the reason finally, but dunno why still.


/php/to/phpsrc/TSRM/tsrm_virtual_cwd.c 
CWD_API int virutal_file_ex(cwd_state *state,.....)
around line 1339

the exact code block:

#if !defined(TSRM_WIN32) && !defined(NETWARE)
..........
if (use_realpath == CWD_REALPATH) {
		return 1;
}
	goto no_realpath;

		
It's the above function that keeps the problem presenting.. 
As i tested, while started as the 1st way, this function return 0, and the tsrm_realpath returns NULL, also tsrm_realpath was called from init_request_info. I think u must be familiarer with the code.
And the 2cd way was all right.

Here is my nginx(0.6.39) conf block:
 server {
                listen 80;
                server_name pk.local.com;
                index index.php;
                root  /home/zyk/pk_local;
                location / {
                        root /home/zyk/pk_local;
                       fastcgi_pass 127.0.0.1:9000;
                      #  fastcgi_pass unix:/usr/local/app/php/logs/php.sock;
                        fastcgi_index index.php;
                        fastcgi_intercept_errors on;
                        include fcgi.conf;
                        include fastcgi_params.default;
                        }
                }

}
Dir /home/zyk/pk_local is RW for the php daemon userid. 

Here is my php configure option:

configure --enable-fastcgi --enable-fpm --enable-mbstring --prefix=/usr/local/app/php

Here is my php-fpm.conf
<?xml version="1.0" ?>
<configuration>

	All relative paths in this config are relative to php's install prefix

	<section name="global_options">

		Pid file
		<value name="pid_file">/usr/local/app/php/logs/php-fpm.pid</value>

		Error log file
		<value name="error_log">/usr/local/app/php/logs/php-fpm.log</value>

		Log level
		<value name="log_level">notice</value>

		When this amount of php processes exited with SIGSEGV or SIGBUS ...
		<value name="emergency_restart_threshold">10</value>

		... in a less than this interval of time, a graceful restart will be initiated.
		Useful to work around accidental curruptions in accelerator's shared memory.
		<value name="emergency_restart_interval">1m</value>

		Time limit on waiting child's reaction on signals from master
		<value name="process_control_timeout">5s</value>

		Set to 'no' to debug fpm
		<value name="daemonize">no</value>

	</section>

	<workers>

		<section name="pool">

			Name of pool. Used in logs and stats.
			<value name="name">default</value>

			Address to accept fastcgi requests on.
			Valid syntax is 'ip.ad.re.ss:port' or just 'port' or '/path/to/unix/socket'
			<value name="listen_address">127.0.0.1:9000</value>

			<value name="listen_options">

				Set listen(2) backlog
				<value name="backlog">-1</value>

				Set permissions for unix socket, if one used.
				In Linux read/write permissions must be set in order to allow connections from web server.
				Many BSD-derrived systems allow connections regardless of permissions.
				<value name="owner">nobody</value>
				<value name="group">nobody</value>
				<value name="mode">0666</value>
			</value>

			Additional php.ini defines, specific to this pool of workers.
			<value name="php_defines">
		<!--		<value name="sendmail_path">/usr/sbin/sendmail -t -i</value>		-->
		<!--		<value name="display_errors">0</value>								-->
				<value name="SERVER_SOFTWARE">nginx</value>								
			</value>

			Unix user of processes
			<value name="user">nobody</value>				

			Unix group of processes
			<value name="group">nobody</value>		

			Process manager settings
			<value name="pm">

				Sets style of controling worker process count.
				Valid values are 'static' and 'apache-like'
				<value name="style">static</value>

				Sets the limit on the number of simultaneous requests that will be served.
				Equivalent to Apache MaxClients directive.
				Equivalent to PHP_FCGI_CHILDREN environment in original php.fcgi
				Used with any pm_style.
				<value name="max_children">5</value>

				Settings group for 'apache-like' pm style
				<value name="apache_like">

					Sets the number of server processes created on startup.
					Used only when 'apache-like' pm_style is selected
					<value name="StartServers">20</value>

					Sets the desired minimum number of idle server processes.
					Used only when 'apache-like' pm_style is selected
					<value name="MinSpareServers">5</value>

					Sets the desired maximum number of idle server processes.
					Used only when 'apache-like' pm_style is selected
					<value name="MaxSpareServers">35</value>

				</value>

			</value>

			The timeout (in seconds) for serving a single request after which the worker process will be terminated
			Should be used when 'max_execution_time' ini option does not stop script execution for some reason
			'0s' means 'off'
			<value name="request_terminate_timeout">0s</value>

			The timeout (in seconds) for serving of single request after which a php backtrace will be dumped to slow.log file
			'0s' means 'off'
			<value name="request_slowlog_timeout">0s</value>

			The log file for slow requests
			<value name="slowlog">logs/slow.log</value>

			Set open file desc rlimit
			<value name="rlimit_files">1024</value>

			Set max core size rlimit
			<value name="rlimit_core">0</value>

			Chroot to this directory at the start, absolute path
			<value name="chroot"></value>

			Chdir to this directory at the start, absolute path
			<value name="chdir"></value>

			Redirect workers' stdout and stderr into main error log.
			If not set, they will be redirected to /dev/null, according to FastCGI specs
			<value name="catch_workers_output">yes</value>

			How much requests each process should execute before respawn.
			Useful to work around memory leaks in 3rd party libraries.
			For endless request processing please specify 0
			Equivalent to PHP_FCGI_MAX_REQUESTS
			<value name="max_requests">500</value>

			Comma separated list of ipv4 addresses of FastCGI clients that allowed to connect.
			Equivalent to FCGI_WEB_SERVER_ADDRS environment in original php.fcgi (5.2.2+)
			Makes sense only with AF_INET listening socket.
			<value name="allowed_clients">127.0.0.1</value>

			Pass environment variables like LD_LIBRARY_PATH
			All $VARIABLEs are taken from current environment
			<value name="environment">
				<value name="HOSTNAME">$HOSTNAME</value>
				<value name="PATH">/usr/local/bin:/usr/bin:/bin</value>
				<value name="TMP">/tmp</value>
				<value name="TMPDIR">/tmp</value>
				<value name="TEMP">/tmp</value>
				<value name="OSTYPE">$OSTYPE</value>
				<value name="MACHTYPE">$MACHTYPE</value>
				<value name="MALLOC_CHECK_">2</value>
			</value>

		</section>

	</workers>

</configuration>

As i dunno if it's a bug yet, maybe it's configuration problem. But there is really no easy way to solve this particular stuff.

Any suggestions? 

Thanks in advance. 

Test script:
---------------
no test script 


Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2010-06-13 13:41 UTC] luk-4u at hotmail dot com
"As i tested, while started as the 1st way, this function return 0, and the tsrm_realpath returns NULL' 
This sentence was written wrong, correct is : the 1st way returns 0; the second returns 1;
 [2010-06-13 15:10 UTC] kalle@php.net
-Package: CGI related +Package: FPM related
 [2010-06-13 15:56 UTC] fat@php.net
-Status: Open +Status: Closed -Assigned To: +Assigned To: fat
 [2010-06-13 15:56 UTC] fat@php.net
FPM is not supported on 5.2.x and your revision is old as the conf file is 
formatted in XML (now it's INI).

Please use 5.3.x from http://snaps.php.net/

If you're using the FPM patch from http://php-fpm.org to use FPM on 5.2.x, 
please ask on the FPM mailing list (http://groups.google.com/group/highload-php-
en).

++ Jerome
 [2010-06-17 04:47 UTC] luk-4u at hotmail dot com
To whomever maintains those code, i really recommond them to specify much more exact, accurate, detailed information for this 'bug', thanks. 
Finally i found out the why, tsrm_virtual_cwd.c :
....................
if (use_realpath != CWD_EXPAND) {
#if !defined(TSRM_WIN32) && !defined(NETWARE)
char resolved_path[MAXPATHLEN];

if (!realpath(path, resolved_path)) {  /* Note: Not threadsafe on older *BSD's */
perror("realpath error:");
  if (use_realpath == CWD_REALPATH) {
printf("=====================%d\n", __LINE__);
	return 1;
  }
  goto no_realpath;
}
..........................

perror outputs Permission denied, so why don't u enlarge this information somewhere in the error log, i mean to let the user have some place to figure out, maybe it's comsumptive in production environment, but u can enable it in a debug compile, and i know this block of code is not FPM specific. 
Maybe because i'm a newbie in this field, miraclely placed the webroot in my home directory, which other users' process doesn't have permission to go through, but i think 'No input file specified' is really too short, too expert-speaking.......
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sat Dec 21 15:01:29 2024 UTC