pcntl not working on Ubuntu 'for security reasons'
Asked Answered
H

2

24

I have installed pcntl on my PHP 5.4.6 running on Ubuntu 32-bit 12.10, using this article.

It didn't go smoothly at all because after compiling, when running make test I got the following errors. I am getting a warning each time that I'm trying to fork a child process which says:

Warning: pcntl_fork() has been disabled for security reasons in /var/www/mydev/dev/mailServiceTest.php on line 8

I've searched all over the web for a solution, but unfortunately I didn't find any mentioning of this problem anywhere else.

    Build complete.
Don't forget to run 'make test'.
PHP Warning:  Module 'pcntl' already loaded in Unknown on line 0
PHP Warning:  Module 'pcntl' already loaded in Unknown on line 0

=====================================================================
PHP         : /usr/bin/php 
Warning: Module 'pcntl' already loaded in Unknown on line 0

PHP_SAPI    : cli
PHP_VERSION : 5.4.6-1ubuntu1.2
ZEND_VERSION: 2.4.0
PHP_OS      : Linux - Linux oleg-Lenovo-G580 3.5.0-26-generic #42-Ubuntu SMP Fri Mar 8 23:20:06 UTC 2013 i686
INI actual  : /php/php-5.4.6/ext/pcntl/tmp-php.ini
More .INIs  :  
CWD         : /php/php-5.4.6/ext/pcntl
Extra dirs  : 
VALGRIND    : Not used
=====================================================================
TIME START 2013-04-28 12:11:03
=====================================================================
FAIL Test pcntl wait functionality [tests/001.phpt] 
FAIL pcntl: pcntl_sigprocmask(), pcntl_sigwaitinfo(), pcntl_sigtimedwait() [tests/002.phpt] 
FAIL pcntl: SIG_BLOCK, SIG_UNBLOCK, SIG_SETMASK [tests/003.phpt] 
FAIL Bug #47566 (return value of pcntl_wexitstatus()) [tests/bug47566.phpt] 
FAIL pcntl_alarm() [tests/pcntl_alarm.phpt] 
FAIL pcntl_exec() [tests/pcntl_exec.phpt] 
FAIL pcntl_exec() 2 [tests/pcntl_exec_2.phpt] 
FAIL pcntl_exec() 3 [tests/pcntl_exec_3.phpt] 
FAIL Test function pcntl_fork() by calling it with its expected arguments [tests/pcntl_fork_basic.phpt] 
FAIL Test function pcntl_fork() by testing the process isolation in the forking hierarchy father -> son -> grandson where father can not knows his grandson [tests/pcntl_fork_variation.phpt] 
FAIL Test pcntl_get_last_error() [tests/pcntl_get_last_error.phpt] 
FAIL pcntl_signal() [tests/pcntl_signal.phpt] 
FAIL pcnt_signal_dispatch() [tests/pcntl_signal_dispatch.phpt] 
FAIL pcntl_wait() [tests/pcntl_wait.phpt] 
FAIL Closures as a signal handler [tests/signal_closure_handler.phpt] 
=====================================================================
TIME END 2013-04-28 12:11:07

=====================================================================
TEST RESULT SUMMARY
---------------------------------------------------------------------
Exts skipped    :    0
Exts tested     :   44
---------------------------------------------------------------------

Number of tests :   15                15
Tests skipped   :    0 (  0.0%) --------
Tests warned    :    0 (  0.0%) (  0.0%)
Tests failed    :   15 (100.0%) (100.0%)
Expected fail   :    0 (  0.0%) (  0.0%)
Tests passed    :    0 (  0.0%) (  0.0%)
---------------------------------------------------------------------
Time taken      :    4 seconds
=====================================================================

=====================================================================
FAILED TEST SUMMARY
---------------------------------------------------------------------
Test pcntl wait functionality [tests/001.phpt]
pcntl: pcntl_sigprocmask(), pcntl_sigwaitinfo(), pcntl_sigtimedwait() [tests/002.phpt]
pcntl: SIG_BLOCK, SIG_UNBLOCK, SIG_SETMASK [tests/003.phpt]
Bug #47566 (return value of pcntl_wexitstatus()) [tests/bug47566.phpt]
pcntl_alarm() [tests/pcntl_alarm.phpt]
pcntl_exec() [tests/pcntl_exec.phpt]
pcntl_exec() 2 [tests/pcntl_exec_2.phpt]
pcntl_exec() 3 [tests/pcntl_exec_3.phpt]
Test function pcntl_fork() by calling it with its expected arguments [tests/pcntl_fork_basic.phpt]
Test function pcntl_fork() by testing the process isolation in the forking hierarchy father -> son -> grandson where father can not knows his grandson [tests/pcntl_fork_variation.phpt]
Test pcntl_get_last_error() [tests/pcntl_get_last_error.phpt]
pcntl_signal() [tests/pcntl_signal.phpt]
pcnt_signal_dispatch() [tests/pcntl_signal_dispatch.phpt]
pcntl_wait() [tests/pcntl_wait.phpt]
Closures as a signal handler [tests/signal_closure_handler.phpt]
=====================================================================

You may have found a problem in PHP.
This report can be automatically sent to the PHP QA team at
http://qa.php.net/reports and http://news.php.net/php.qa.reports
This gives us a better understanding of PHP's behavior.
If you don't want to send the report immediately you can choose
option "s" to save it.  You can then email it to [email protected] later.
Do you want to send this report now? [Yns]: y

Please enter your email address.
(Your address will be mangled so that it will not go out on any
mailinglist in plain text): [email protected] 

Posting to http://qa.php.net/buildtest-process.php

Thank you for helping to make PHP better.
oleg@oleg-Lenovo-G580:/php/php-5.4.6/ext/pcntl$ version

When typing the following command, it seems that PHP is indeed already installed, although the PHP interpreter didn't recognize the function before I installed this extension at all:

oleg@oleg-Lenovo-G580:/php/php-5.4.6/ext/pcntl$ php -m | grep pcntl
PHP Warning:  Module 'pcntl' already loaded in Unknown on line 0
pcntl

How can I configure this feature to work properly?

Harvard answered 28/4, 2013 at 12:28 Comment(2)
Well, remove it from the disable_functions config.... (see output of php -d disable_functions=pcntl_fork -r 'pcntl_fork();' or php -d disable_functions=substr -r 'substr(1);' for that matter). Note that it is a bad idea to fork in a webserver.Philipines
thank you, but I am using this script on CLI sapi, so it should be fineHarvard
H
53

sudo gedit

sudo gedit /etc/php5/cli/php.ini

or \ and

sudo gedit /etc/php5/apache2/php.ini find:

disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl

Comment this out:

;disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl
Harvard answered 28/4, 2013 at 12:36 Comment(3)
Hm, why is your cli script loading /etc/php5/ apache2 /php.ini?Philipines
If you have to use the GUI and need root access, use gksudo instead: askubuntu.com/a/11766/63492Brainwashing
Hello Aditya, the specified answer speaks about editing files in your home directory with as a superuser, that is not the case here, the php.ini file is already owned by your web server user (www-data for apache), or at the worse case by root himself, but never by your user.Harvard
D
0

I too had this problem. Ubuntu ships with some sample PHP configuration files in /usr/share/php5: php.ini-production is the template for the Apache web server PHP config (/etc/php5/apache2/php.ini) and it disables pcntl_fork and other functions. php.ini-production.cli is the template for PHP run from the command line (/etc/php5/cli/php.ini) including when you're running tests, and it doesn't disable any functions. But somehow my /etc/php5/cli/php.ini was a copy of the Apache config which disables these functions.

I'm not sure how this happened. I installed my LAMP stack with Ubuntu 12.04. My /etc/php5/cli/php.ini file dated from October 2013, suggesting Ubuntu 13.10 set it up; maybe that release copied the wrong file. Ubuntu upgrades update the sample files in /usr/share/php5 but leave the files in /etc/ alone.

To fix it I used

$ sudo cp -pi /usr/share/php5/php.ini-production.cli /etc/php5/cli/php.ini

to copy the default command-line settings file. Obviously if you've made changes to the command-line PHP5 settings, this will overwrite them; use your UNIX skills to diff and merge them.

Danish answered 15/4, 2014 at 19:15 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.