PHP: Difference between revisions
Removed old installation content |
|||
| Line 1: | Line 1: | ||
PHP is a server-side scripting | PHP is a server-side scripting language. | ||
== Installation == | == Installation == | ||
Refer to the Dockerfiles at https://git.steamr.com/docker/php-fpm if you wish to install PHP-FPM manually. | |||
=== Troubleshooting === | === Troubleshooting === | ||
==== HTTP POST Array Empty ==== | ==== 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 {{code|Content-Type}} header set for it to be populated regardless of the HTTP method being used. | 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 {{code|Content-Type}} header set for it to be populated regardless of the HTTP method being used. | ||
Revision as of 22:31, 1 September 2019
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.
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
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/
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);