I am writing an app for iOS that will start the php binary as a sub process.
The following code is used:
NSString * command = #"/bin/sh -c '";
command = [command stringByAppendingString:[BibleditPaths php]];
command = [command stringByAppendingString:#" -v' > /tmp/php.txt 2>&1"];
int output = system ([command UTF8String]);
NSString* msg = [#(output) stringValue];
NSLog(msg, #"");
The php binary can be started on a jailbroken iPad from the command line. This is the output:
PHP 5.4.31 (cli) (built: Aug 19 2014 11:06:21)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies
When starting the php binary from the code above, iOS sends the SIGKILL signal.
The php binary does not run or produce any output.
/bin/sh produces this output:
sh: line 1: 2806 Killed: 9 /bin/sh -c '/var/mobile/Applications/DFE552CC-ECBE-4A73-82CF-24870E5D9F62/Library/usr/local/bin/php -v' > /tmp/php.txt 2>&1
2014-09-15 17:33:41.676 PHPRunner[2804:60b] 35072
What can I do to get iOS to run this process successfully?
This question was posted on the Apple iOS development forum (https://devforums.apple.com/index.jspa).
The response there was:
"None of that is supported (or permitted by the application sandbox) on iOS."
Subsequently the question was deleted from the forum.
I am posting the answer here so the information is kept for the public.
Related
I'm not able to print kubectl output on chrome web browsers using php shell_exec() function.
i'm trying to display output of shell_exec() on my web browser.
The php code is working fine when i run on terminal but as i run on chrome then only output2 is printing. But i need to print output1 as well.
Can any one help to resolve this issue?
Running my status.php with below on CentOS Linux release 7.9.2009 (Core)
cmd: php status.php
My status.php page:
<?php
$ns = "bind";
echo $ns;
$cmd = "kubectl --kubeconfig /var/www/html/config get pod -n $ns";
$cmd2= "ls -lrth";
echo "<pre>";
$output1 = shell_exec($cmd);
$output2 = shell_exec($cmd2);
echo $output1; // Printing this output value on terminal but not printing on web browser
echo $output2;
echo "</pre>"; // Printing this output2 value on terminal as well web browser
echo "after shell_exce funtion"
?>
--
My OS is CentOS Linux release 7.9.2009 (Core)
cat /etc/redhat-release
my php version:
PHP 5.4.16 (cli) (built: Apr 1 2020 04:07:17)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
i'm trying to display output of shell_exec() on my web browser.
code is working fine when i run on terminal but as i run on chrome then only output2 is printing.
But i need to print output1 as well.
I have a server hosted on 1and1 and I am using Laravel. When I want to execute the Artisan command to schedule a tasks, I get this error:
$ php artisan schedule:run
Warning: Unexpected character in input: '\' (ASCII=92) state=1 in /htdocs/artisan on line 31
Parse error: syntax error, unexpected T_STRING in /htdocs/artisan on line 31
After a lot searches, nothing solved my issue (do an alias for PHP, call $ php5.5 instead $ php, etc.).
The main problem is that a call to php uses version 4.4.9 of PHP, instead 5.5 that Laravel needs.
$ php -v
PHP 4.4.9 (cgi-fcgi) (built: Mar 31 2016 16:41:29)
Copyright (c) 1997-2008 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies
$ php5.5 -v
PHP 5.5.35 (cgi-fcgi) (built: May 3 2016 07:09:03)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies
I changed the call to php5.5 and altered the Artisan file, calling this on the first line:
#!/usr/local/bin/php5.5
<?php
But at the end I always get this from artisan module calls:
Running scheduled command: '/usr/local/bin/php' 'artisan' moneySaved:send >> './logs/log.log' 2>&1 &
So the problem must come from who generates those "Running scheduled command" lines.
After a research, the problem was in the way that Symfony internal scripts "locate" the php path to call it. Specifically those:
epoc/vendor/symfony/process/PhpExecutableFinder.php
epoc/vendor/laravel/framework/src/Illuminate/Console/Scheduling/Schedule.php
The binary var holds the path to call PHP. In my case I forced it to use the 1and1 path for php5.5, and that's all.
public function command($command, array $parameters = []) {
//$binary = ProcessUtils::escapeArgument((new PhpExecutableFinder)->find(false));
$binary = "/usr/local/bin/php5.5";
if (defined('HHVM_VERSION')) {
$binary .= ' --php';
}
if (defined('ARTISAN_BINARY')) {
$artisan = ProcessUtils::escapeArgument(ARTISAN_BINARY);
} else {
$artisan = 'artisan';
}
return $this->exec("{$binary} {$artisan} {$command}", $parameters);
}
Now it works!
The problem is that when running scheduled commands, Laravel uses Symfony's "PhpExecutableFinder" to identify and locate the path to the PHP binary to use to run the scheduled commands.
And depending on the context from which artisan schedule:run is called, PhpExecutableFinder will not return the path to the correct PHP binary.
However, in the current version of PhpExecutableFinder there is an if clause which checks whether PHP_PATH is defined in the environment. If so and set to an executable path, it is returned.
So I added export PHP_PATH=/usr/local/bin/php8.0; right before the call to artisan schedule:run in the crontab:
* * * * * export PHP_PATH=/usr/bin/php8.0; $PHP_PATH artisan schedule:run >> /dev/null 2>&1
and instead of the default (and wrong) /usr/bin/php, the correct
/usr/bin/php8.0 was used to run the scheduled commands.
This fixed the problem I had with running FreeScout on IONOS hosted webspace (see also this FreeScout issue).
I have a php script file test1.php
<?php
echo "hello\n"
?>
When i try to run the php through command line using following code only one php process run and other php process is stopped.
We can see only one hello is printed.
Why other process is stopped ?
[root#home usr]# php -f test1.php & php -f test1.php
[30] 20817
hello
[root#home usr]#
[30]+ Stopped php -f test1.php
PS:
PHP 5.4.16 (cli) (built: Jun 23 2015 21:17:27)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
The scripts get executed in parallel.
Try this modified version of a test script:
<?php
// Read first command line argument
$delay = (int) $argv[1];
// Wait for $delay seconds
sleep($delay);
// Output some message
echo "Result after $delay seconds\n";
If you invoke this script via php hello.php 3 & php hello.php 1 you will see that the first call will run for 3 seconds and print some output while the second call will only run for 1 second and print some output before the first call sends output:
root#httpserver:/tmp# php hello.php 3 & php hello.php 1
[1] 15991
Result after 1 seconds
root#httpserver:/tmp# Result after 3 seconds
If you are looking for other ways of parallel script execution you should have a look at this article https://d-mueller.de/blog/parallel-processing-in-php/
I have a script that I'm using to run cron jobs for WP All Import Pro. The script ran with no errors on Debian Jessie, I am in the process of moving to a dedicated server running CENTOS 6.7 x86_64, WHM 11.50.0 & cPanel.
Running the script on the new server throws this error & fills up the custom log file:
Error in argument 2, char 2: option not found r
The -r option is for running php without script tags:
-r <code> Run PHP <code> without using script tags <?..?>
Not sure what to do at this point, any help would be greatly appreciated.
PHP CLI Version
root#host [~]# php-cli -v
PHP 5.5.28 (cli) (built: Aug 28 2015 14:51:30)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies
with the ionCube PHP Loader v4.7.5, Copyright (c) 2002-2014, by ionCube Ltd., and
with Zend Guard Loader v3.3, Copyright (c) 1998-2014, by Zend Technologies
with Suhosin v0.9.36, Copyright (c) 2007-2014, by SektionEins GmbH
THE SCRIPT
#!/bin/bash
#!/usr/bin/php-cli
## http://devlog.rolandow.com/2014/11/wp-import-cron-cli-update/
while getopts ":j:" opt; do
case $opt in
j)
jobId=$OPTARG
;;
\?)
echo "Invalid option: -$OPTARG" >&2
;;
:)
echo "Option -$OPTARG requires an argument." >&2
exit 1
;;
esac
done
if [ "$jobId" = "" ]; then
echo No job id
exit 1
fi
# Set magic variables for current FILE & DIR
__FILE__="$(test -L "$0" && readlink "$0" || echo "$0")"
__DIR__="$(cd "$(dirname "${__FILE__}")"; echo $(pwd);)"
LOGFILE="${__DIR__}/tmp/wpai_cron_${jobId}.log"
CURLOG="${__DIR__}/tmp/wpai_cron_${jobId}_current.log"
DONE=0
function log {
echo "$(date): $*" >>$LOGFILE
}
log "Start import for jobID $jobId"
cd $__DIR__/public_html
php -e -r 'parse_str("import_key=ica&import_id='$jobId'&action=trigger", $_GET); include "wp-cron.php";' >>$LOGFILE 2>&1
sleep 1
while [ $DONE -eq 0 ]
do
php -e -r 'parse_str("import_key=ica&import_id='$jobId'&action=processing", $_GET); include "wp-cron.php";' >$CURLOG 2>&1
cat $CURLOG >>$LOGFILE
DONE=$(grep 'is not triggered' $CURLOG | wc -l)
sleep 1
done
rm $CURLOG
log "End of import for jobId $jobId"
log ""
log ""
THE ERROR
Fri Sep 4 05:17:41 EDT 2015: Start import for jobID 04
Error in argument 2, char 2: option not found r
Usage: php [-q] [-h] [-s] [-v] [-i] [-f <file>]
php <file> [args...]
-a Run interactively
-b <address:port>|<port> Bind Path for external FASTCGI Server mode
-C Do not chdir to the script's directory
-c <path>|<file> Look for php.ini file in this directory
-n No php.ini file will be used
-d foo[=bar] Define INI entry foo with value 'bar'
-e Generate extended information for debugger/profiler
-f <file> Parse <file>. Implies `-q'
-h This help
-i PHP information
-l Syntax check only (lint)
-m Show compiled in modules
-q Quiet-mode. Suppress HTTP Header output.
-s Display colour syntax highlighted source.
-v Version number
-w Display source with stripped comments and whitespace.
-z <file> Load Zend extension <file>.
-T <count> Measure execution time of script repeated <count> times.
I have exactly the same script and set up as you, changing
php -e -r
to
php5-cli -e -r
made it run smoothly. Note it's in 2 places in the script.
I'm trying to run bash script in PHP but can't run it.
php -v
PHP 5.3.10-1ubuntu3.2 with Suhosin-Patch (cli) (built: Jun 13 2012 17:19:58)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies
Ubuntu 12.04 LTS 64 bit.
My php code:
$cmd='/www/var/pl/bash.sh';
$retval =-1;
exec( $cmd, $output ); //executing the exec function.
foreach( $output as $tmp )
{
echo "$tmp <br>";
};
bash.sh:
#!/bin/bash
swipl --quiet -s /var/www/pl/ples.pl -g "f(R, gel), writeln(R),open('/var/www/pl/in.txt',write, Stream),
write(Stream, (R)),
nl(Stream),
close(Stream)" -t halt.
What am I doing wrong?
And I can run bash.sh in the Linux terminal.
When you run the script in the terminal you are executing it under the account you are logged in to. You have a shell setup with a search path etc.
When php executes the script, it has not a shell setup, and runs under the webserver user account. When executing:
make sure you have complete paths to your file, swipl is not enough, it should be /path/to/swipl
make sure the webserver process has enough access rights to get everything it needs.
Most likely it is either a path or permission problem; for example the user the web application runs as, has no idea where the swipl program is.
Add 2>&1 to the command line before exec'ing it, so that it tells you what the problem is. Or you can find the stderr output into the web server error log (or PHP error log; check its path and settings in php.ini).