PHP
PHP is a server-side scripting language.
Installation
Refer to the Dockerfiles at https://git.steamr.com/docker/php-fpm if you wish to install PHP-FPM manually.
Stuff
Error Reporting
To always show all errors and warnings:
error_reporting(E_ALL);
ini_set('display_errors', 1);
In more detail:
// Turn off all error reporting
error_reporting(0);
// Report simple running errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);
// Reporting E_NOTICE can be good too (to report uninitialized
// variables or catch variable name misspellings ...)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
// Report all errors except E_NOTICE
// This is the default value set in php.ini
error_reporting(E_ALL ^ E_NOTICE);
// Report all PHP errors (see changelog)
error_reporting(E_ALL);
// Report all PHP errors
error_reporting(-1);
// Same as error_reporting(E_ALL);
ini_set('error_reporting', E_ALL);
UTF-8 to hex
There is basically NO good way.
- http://www.tokyomuslim.com/2008/01/php-convert-utf-8-to-hex-codepoint-values-unicode-hexidecimal/
- http://hsivonen.iki.fi/php-utf8/
Troubleshooting
HTTP POST Array Empty
I had an issue where a PHP POST array was empty when a POST request was made. It turns out that PHP now needs the Content-Type header set for it to be populated regardless of the HTTP method being used.
In detail, when the following request was made, $_POST was empty:
POST /print HTTP/1.1
Connection: Keep-Alive
User-Agent: WebSlipPrinting
Content-Length: 56
Host: 172.20.1.151
template_data=Hello There!&Username=test&Password=123456
The data though was still sent since $_SERVER['CONTENT_LENGTH'] was 56 as in the original request. The data was also present in the php://input stream. ie:
var_dump(file_get_contents("php://input"));
# Returned:
# string(56) "template_data=Hello There!&Username=test&Password=123456"
Adding the Content-Type value to the header fixes the issue, with the final request as:
POST /print HTTP/1.1
Connection: Keep-Alive
Content-Type: application/x-www-form-urlencoded
User-Agent: WebSlipPrinting
Content-Length: 56
Host: 172.20.1.151
template_data=Hello There!&Username=test&Password=123456
This may have something to do with the enable_post_data_reading option in PHP. From the config file:
647 ; Whether PHP will read the POST data.
648 ; This option is enabled by default.
649 ; Most likely, you won't want to disable this option globally. It causes $_POST
650 ; and $_FILES to always be empty; the only way you will be able to read the
651 ; POST data will be through the php://input stream wrapper. This can be useful
652 ; to proxy requests or to process the POST data in a memory efficient fashion.
653 ; http://php.net/enable-post-data-reading
654 ;enable_post_data_reading = Off
PDOException : could not find driver
You need to have the pdo driver installed. In my case, I was trying to use the pdo-mysql connector which wasn't compiled with PHP. To fix this, install the PDO driver or compile it manually with:
--with-pdo-<driver>
In my case, I needed mysql:
--with-pdo-mysql
mail() issues
If mail() returns sh: -t: command not found when attempting to run the mail() function, you probably did not set the sendmail_path variable in your php.ini.
Change:
; sendmail_path =
To:
sendmail_path = /usr/sbin/sendmail -t -i
If you get Recipient names must be specified when calling mail(), you need to set the -t flag in sendmail_path in php.ini.