Access php status information from inside php - php

php-fpm provides a status page for those who are interested. It looks like this:
curl http://localhost/server-status
pool: default
process manager: dynamic
start time: 11/Dec/2014:17:51:33 -0500
start since: 61383
accepted conn: 4682
listen queue: 0
max listen queue: 0
listen queue len: 0
idle processes: 11
active processes: 1
total processes: 12
max active processes: 2
max children reached: 0
slow requests: 3
How do I access this information from php? Please don't tell me to use curl to request the status page from localhost.

Unfortunately server-status from FPM is not PHP mechanism. You cannot get it by internal PHP mechanisms.
Your only way to reach this is using some kind of connect mechanism to fpm server itself.
You can get it by grabbing info from url with CURL or file_get_contents() or any other mechanisms that fetches data from url.
You can connect local socket with shell exec using parameters like:
(shell code)
SCRIPT_NAME=/status \
SCRIPT_FILENAME=/status \
REQUEST_METHOD=GET \
cgi-fcgi -bind -connect /var/run/php-fpm/www.sock
You can use some kind of variation of socket connecting with parameters. I haven't tried that, but a good place to start is here: https://github.com/wizaplace/php-fpm-status-cli
Probably if you get very stubborn you can find another creative way, but either of them are doing it as internal mechanism of PHP-FPM.

In ubuntu I was able to access PHP-FPM status page by this
SCRIPT_NAME=/status SCRIPT_FILENAME=/status REQUEST_METHOD=GET cgi-fcgi -bind -connect /var/run/php/php7.0-fpm.sock
Note: You may get not found error while running above command, like
Primary script unknown
Status: 404 Not Found
Content-type: text/html; charset=UTF-8
File not found.
If you are getting this error make sure you have uncommented pm.status_path = /status in pool.d/www.conf.
Absolute path for that config file in ubuntu 17.04 with PHP 7 is /etc/php/7.0/fpm/pool.d/www.conf and line number is 232
After editing conf file restart fpm with service php7.0-fpm restart
GETTING IT VIA PHP SCRIPT
You can get output of php-fpm status by running above command via php with exec()
exec( 'SCRIPT_NAME=/status SCRIPT_FILENAME=/status REQUEST_METHOD=GET cgi-fcgi -bind -connect /var/run/php/php7.0-fpm.sock', $php_fpm_status );
// Above statement will assign an array to $php_fpm_status filled with every line of output from the command, make it as whole string
$php_fpm_status = implode(PHP_EOL, $php_fpm_status);
// You can try printing php-fpm status
echo $php_fpm_status;

Related

Artisan Error: Failed to listen on localhost:8000

I'm having a problem starting my Laravel installation. Whenever I type in the terminal php artisan serve, I get this error:
Failed to listen on localhost:8000 (reason:une tentative d'access un
α socket de maniere interdite par ses autorisation d'access a 0t0
tent0e)
What's the problem, and how can it be fixed?
img problem http://i.imgur.com/rOt3Lat.png
it's working now I just changed the listen port from 8000 to 8888 or any other port your services didn't use it
php artisan serve --port="8888"
Fixing Error: Failed to listen on localhost:8000 (reason: Address already in use)
List processes with php in it
ps -ef | grep php
Example output
501 **9347** 393 0 1:29PM ttys000 0:00.21 php artisan serve
501 9351 **9347** 0 1:29PM ttys000 0:02.01 /usr/local/php5-5.6.14-20151002-085853/bin/php -S localhost:8000 .../laravel/server.php
501 9781 393 0 1:56PM ttys000 0:00.00 grep php
Then kill the process
kill -9 9347
Are there any other services running on port 8000?
You can use this command on Windows:
netstat -aon | more
or on Linux / OSX
sudo netstat -plnt
to see what services are running. Then disable the service that is running on port 8000 or use another port.
List process using ps -ef | grep php
Then below only works for me
kill -9 9347
which is a force kill of the process
501 9347 393 0 1:29PM ttys000 0:00.21 php artisan serve
Option 2:
If above not works, Change the default laravel serve port number if you can, like
php artisan serve --port=8088
8000 is the default port. Use instead of :
php artisan serve --port=8005
It is because something already running on that port and you can change the port by command itself, by running following command
php artisan serve --port 8001
Use killall -9 php and if you want to close other services use killall -9 node or killall -9 mysql
When php artisan serve command given, below mentioned problem occured.
macridmi1109#Ridmis-MacBook-Pro kcnk % php artisan serve
Laravel development server started on http://localhost:8000/
[Thu Aug 6 11:31:10 2020] Failed to listen on localhost:8000 (reason: Address already in use)
Then try this line of code,
macridmi1109#Ridmis-MacBook-Pro project_laravel % ps -ef | grep php
Result will be,
501 66167 1 0 11:24am ttys002 0:00.77 /usr/bin/php -S localhost:8000
/Users/macridmi1109/Documents/Laravel/project_laravel/server.php
501 66268 64261 0 11:31am ttys002 0:00.00 grep php
Finally run the below code and, then again php artisan serve
macridmi1109#Ridmis-MacBook-Pro project_laravel % kill 66167
SOLUTION EXPLAINED BELOW
I use the command, ps -ef | grep php. After that, you will be able to find Process ID. After recognising the correct Process ID, use this command kill 66167 (kill "Process ID"). Then try php artisan serve. This worked for me.
Happy Coding😊
For me, it was silly mistake. I have installed php in new machine but php.ini was missing. So, I have created php.ini file from php.ini-production file and then php artisan serve command worked fine as expected.
for me php -S localhost:8080 from the terminal in vs code will sometimes crash, but still be running in the background.
-9 to force kill did it for me
thanks #hemss
I did
php -S localhost:8080
[Wed Dec 12 13:48:03 2018] Failed to listen on localhost:8080(reason: Address already in use)
then I..
sudo netstat -plnt
find the process running on port 8080
tcp 2 0 127.0.0.1:8080 0.0.0.0:* LISTEN 10312/php
then force kill it..
kill -9 10312
I get
[1] + 10312 killed php -S localhost:8080
then restart...
php -S localhost:8080
best way if you 8000 port is busy or you have more one project running is run your project in new port such as 8088 or another free port.
php artisan serve --port=8088
The solution I found a problem we face several times in Ubuntu.
*Failed to listen on 127.0.0.1:8000 (reason: Address already in use)*
What we do, we change the port, right?
This problem can be solved also in few seconds following below steps.
1. Open Terminal
2. **sudo su**
3. **netstat -plnt**
_find the process running on port 8080_
4. **kill -9 PROCESSNUMBER**
For more details, see my blog, click here
If you have all your configurations ok in the .env file then you should:
Use the answer from mayorsanmayor in this post to kill all php processes.
Then php artisan config:clear
Finally, php artisan serve
Good luck!

When when executing git from PHP fail to use the proxy?

We are calling a bash script from PHP that will do a simple git pull.
When we run this script from terminal using root or the apache user it executes fine.
However, when php excecutes the script using exec it outputs this error:
error: Failed to connect to XX.XX.XX.XX: Permission denied while accessing https://someuser#bitbucket.org/somecompany/testproject.git/info/refs
XX.XX.XX.XX is the IP address our http proxy resolves to
It also prints out the user and proxy config (as you will see in the bash script below)
PHP:
chdir('/var/www/scripts');
$cmd = './gitBranch.sh 2>&1';
exec($cmd,$currentOutput,$err);
print_r($currentOutput);
BASH:
#!/bin/bash
cd /var/www/gitManagedPackages/testproject
whoami #to verify it's the apache user
git config --get http.proxy #to verify it has the proper proxy setting
git pull
When running the script as the apache user [su -c ./gitBranch.sh -s /bin/sh apache]
apache
http://someproxy.somecompany.net:8181
Already up-to-date.
Why does it fail when running from PHP? It's executing as the apache user and has the correct proxy set.
As it turns out, httpd is not allowed to make outgoing connections by default. The outputted error is actually from git's use of curl.
running this fixed it:
setsebool -P httpd_can_network_connect 1

Stopping in-built php server on Mac Mavericks - Livecode

I'm developing something in Livecode and I have been experimenting with using Mavericks own in-built php server. I started the server by sending the following command through shell...
php -S localhost:8000
This enabled PHP to run successfully through localhost:8000/
However, I can not work out how to stop/disable PHP now in order to continue testing starting it - when I previously started PHP through the terminal I was able to do ctrl+c to stop php running but since I do not yet know how to do this through my app I get this error instead...
Failed to listen on localhost:8000 (reason: Address already in use)
Anybody know how I can stop it either via the terminal or through my Livecode app? Attempts to stop it through the terminal using just ctrl+c do not work
open a terminal and type:
ps -ef | grep php
it will list the php process with the pid (process id)
something like
$ ps -ef | grep php
501 14263 14133 0 10:25AM ttys001 0:00.21 php -S localhost:8000
501 14355 14265 0 10:25AM ttys002 0:00.00 grep php
The note the number for the line that lists your php process, the second column is your pid
in the example the process id us 14263, kill it:
$ kill 14263
do another ps
$ ps -ef | grep php
501 14358 14265 0 10:26AM ttys002 0:00.00 grep php
$
The process should not be listed anymore

How do you setup MONIT to monitor php5-fpm?

One of the solutions I found is this:
check process php5-fpm with pidfile /var/run/php5-fpm.pid
group php
start program = "/etc/init.d/php5-fpm start"
stop program = "/etc/init.d/php5-fpm stop"
if failed unixsocket /tmp/php-fpm.sock then restart
if 4 restarts within 5 cycles then timeout
depends on nginx
This does not work because the following file does not exist in my system:
/tmp/php-fpm.sock
When I run sudo find / -name *.sock I get:
/run/mysqld/mysqld.sock
/run/fail2ban/fail2ban.sock
/var/lib/php5-fpm/web2.sock
/var/lib/php5-fpm/ispconfig.sock
/var/lib/php5-fpm/apps.sock
If it helps, this is the file I change to configure how php behaves with the particular domain I use : /etc/php5/fpm/pool.d/web2.conf. So MAYBE the right file is `/var/lib/php5-fpm/web2.sock ?
This is a VPS with ubuntu 12.04 and nginx 1.4.4.

Problem with DKIM socket

I have a problem with dkim-milter.
My maillog file is filled with logs
Dec 5 23:59:59 NS1 dkim-filter[31424]: Sendmail DKIM Filter: Unable to bind to port inet:20209#localhost: Address already in use
Dec 5 23:59:59 NS1 dkim-filter[31424]: Sendmail DKIM Filter: Unable to create listening socket on conn inet:20209#localhost
Dec 5 23:59:59 NS1 dkim-filter[31424]: smfi_opensocket() failed
I suspect that the problem is related to Dkim-filter.conf and line:
Socket inet:20209#localhost
It looks like something is allready runing on that port so I can't bind it again.
How can I change this and make DKIM running without errors?
As a note, I found that when I manually stopped and restarted the dkim-milter service, my logs filled up with that message. This was due to the config option "AutoRestart" which defaults to Yes"
With that option on, when the service is stopped using "service dkim-milter stop", it automatically restarts, and when my shell script then ran "service dkim-milter start" a few seconds later, it was duplicating the process and was unable to connect to the port as it was already running.
I am not really experienced enough to know the best was to fix it, but the problem above was tested and repeatable.
In my case, I was running the wrong command. Instead of running
sudo opendkim -x /etc/opendkim.conf -p inet:8891#localhost
I was running:
sudo opendkim -x /etc/opendkim.conf -p init:8891#localhost
Not sure how common this is, but it sure took me a while to track down.
port 20209 is already in use, maybe an old zombie dkim-milter?
netstat -nlp | grep 20209 will help you find out whats blocking the port
I had the same problem so with the help of a friend I followed the steps below:
Show 25 more recent errors from logs (/path/to/file): tail -n 25 /var/log/maillog
Listen to specific port (20209) to see what's blocking it: netstat -nlp | grep 20209
Check status of a service (dkim-milter in this case): service dkim-milter status
Show all proccesses with "filter" in name, because dkim-milter is
running as dkim-filter: ps ax | grep filter
Kill process with pid f.e. 32731: kill 32731
Now the process which produced the errors isn't running.
This is how to restart to dkim-milter and postfix:
service dkim-milter stop
service dkim-milter start
service postfix restart
And everything seemed to work ok now

Categories