問題描述
Codex loosely only mentions PHP version in server requirements,但 PHP 可以配置在不同的範圍內,包括不同的部分。
什麼是擴展/庫:
- WP 是否需要工作? MySQL …
- 需要具體的功能? GD?
- 最適合運作的具體功能?捲曲…
- 是插件常用嗎?壓縮…
最佳解決方案
我給了這個更多的想法和給定的 WP 代碼庫 (包括捆綁庫) 的大小,似乎並不現實的手工編譯這樣的列表 (並重復它為每個新版本 – meh) 。
我查找了適當的靜態代碼分析工具–PHP_CompatInfo,並且在核心擴展使用的報告 (版本掃描 3.3.1) 之後生成了一些修補之後:
-
- HTTP API(
WP_Http_curl類) -
url_is_accessable_via_ssl() - SimplePie(用
WP_SimplePie_File類覆蓋) - GoogleSpell(來自 TinyMCE 包,是不是用?)
- HTTP API(
- Date/Time – 367 使用
-
-
iis7_rewrite_rule_exists() -
iis7_delete_rewrite_rule() -
iis7_add_rewrite_rule() -
saveDomDocument()
-
- POSIX Regex – 23 使用
-
Filter – 2 用途
PHPMailer->ValidateAddress()(可選)
-
FTP – 72 用途
ftp_base級ftp類 (純插座版本)WP_Filesystem_FTPext級WP_Filesystem_ftpsockets級
-
GD – 56 用途
-
wp-adminincludesimage-edit.php -
wp-adminincludesimage.php -
wp-includesmedia.php
-
-
Hash – 6 用途
-
wp-includespluggable.php多用途 (可選 – 在wp-includescompat.php中的後備)
-
-
iconv – 5 用途
SimplePie(可選)-
wp_check_invalid_utf8()(可選) -
wp-mail.php(可選)
-
JSON – 20 用途
- 可選,後退在
wp-includes/compat.php
- 可選,後退在
-
libxml – 4 用途
WP_oEmbed->_parse_xml()(可選)- SimplePie
-
Multibyte String – 29 使用
- 在
wp-includes/compat.php中有一些回退
- 在
-
MySQL – 60 用途
wpdb級SimplePie_Cache類 (用WP_Feed_Cache類覆蓋)
-
OpenSSL – 4 用途
PHPMailer級
- PCRE – 743 用途
-
SimpleXML – 1 使用
WP_oEmbed類 (似乎可選)
-
Sockets – 64 用途
ftp(sockets實現)
- SPL – 3 用途
-
Tokenizer – 3 用途
-
wp_doc_link_parse()(可選)
-
- XML Parser – 89 使用
-
XMLReader – 1 使用
- SimplePie(似乎可選)
- Zlib – 30 使用
次佳解決方案
這個答案可能很複雜,很長,據我所知,服務器與服務器之間也會有一些區別。操作系統 (IIS,Apache).. 我不能説以下列表是一個完整列表,但它包括我知道的一些必需的:
- Curl 和 CurlSSL – 不確定是否需要,但是如果 WordPress 代碼可用,則大部分 WordPress 代碼將使用它。然而,許多插件需要它和/或在沒有它的情況下將具有有限的功能。
- Exif – 允許 WordPress 的媒體處理程序從圖像中拉出 Exif 數據。
- Gettext – .po .mo 處理翻譯本地化國際化..
- FTP – 用於通過 FTP 進行插件和 WordPress 升級。
- GD – 不需要介紹,對吧?
- Iconv – 從郵件到 RSS 解析的所有字符集轉換。
- Mbregex 和 Mbstring – 這個名字是非常描述性的 – 提供的功能遍及全部:-)
- Mcrypt – 不需要 wordpress,但許多插件確實需要它。
- Mime Magic – 現在在 wordpress 中已經不再適用 – 但仍然有很好的後台兼容性。
- *系統的 Mysql 和 Mysql * – 我們都知道這是什麼,為什麼需要,否?
- Openssl – 此庫用於處理使用 SSL 證書加密的處理連接,用於 WordPress 可能能夠連接到任何 SSL(https) 加密位置。
- POSIX – 用於確保 WordPress 正確維護文件權限和所有權。
- 路徑信息檢查 – 一些永久鏈接設置。
- Pspell – TinyMCE 的拼寫檢查功能。
- 套接字 – 在 WordPress 中管理 FTP 連接和郵件處理 AKA SMTP 和 POP 。
- Zip – 不確定是否需要 – 但是這個 cross-platform 兼容的 zip 文件創建和提取類將被 wordpress(如果可用) 使用。
- Zlib – 在許多情況下使用。示例 – js 和 css 文件壓縮。再次,不確定是否需要但需要。
如上所述 – 這絕對不是一個完整的列表 – 它是在一年前編譯的 – 它可能需要一些更新。這些功能中的許多功能不是完全需要的,而是被提醒。在很多情況下,wordpress 會使用一個可用的函數,如果沒有,將忽略該任務。一個很好的例子是缺少 GD 庫,它不會停止 wordpress 功能,但它不會裁剪,調整大小或更改上傳的圖像 – 從而留下原始的 (並且將 「插入圖像中的”size” 選項」 帖子 「功能)..
作為一個附註 – 我也會説,也許這個問題可能會得到更正確/更新的答案在 serverfault.com 比在這裏…
第三種解決方案
(這不是一個答案,只是一些有用的信息,如果你認為這個信息沒有用,讓我知道,我會刪除它。)
我認為在新手上談論會更容易,但由於系統與系統的不同,所以很難覆蓋所有這些。
根據 Debian(& Debian-based 發行版) 的經驗,我想分享一下這個具體信息:
- php5-cli
- php5-dev
- php5-fpm
- php5-cgi
- php5-mysql
- php5-xmlrpc
- php5-curl
- php5-gd
- php-apc(不需要,但推薦)
- php-pear
- php5-imap
- php5-mcrypt
- php5-pspell
上述軟件包安裝了其他答案中提到的所有擴展/庫/模塊; 所有,除了 Mime Magic,這是 no longer required by WordPress 。
確保您的服務器與 WordPress 100%兼容的另一個好方法是檢查託管主機公司來自哪裏的 pre-installed 。由於他們多年的客户投訴關於不兼容的經驗,他們會更好地瞭解。
In case of Hostgator 是 pre-install 包含的 PHP 模塊 (您可能只需要大多數但不是全部)
Media Temple 提供了一個 phpinfo(); 文件供您檢查其配置。這對比較有用。
第四種方案
如果您使用 Debian 7(Debian Wheezy),則需要安裝 PHP 本身和少量擴展。 @Rarst 提到的大部分內容已經包含在 Debian 最基本的 PHP 安裝之一中。
PHP
Debian Wheezy 有四個選項:libapache2-mod-php5,libapache2-mod-php5filter,php5-cgi 或 php5-fpm 。我選擇 php5-fpm,但這一切都取決於您希望您的 Web 服務器和 PHP 進行交互。
MySQL
你也需要 PHP 來使用 MySQL 。您的選項是 php5-mysql 和 php5-mysqlnd 。 php5-mysqlnd 是本機的,通常更快。有些人可能會選擇像 MariaDB 這樣的選擇。
圖形庫可選
如果要使圖像調整大小,可以安裝 php5-gd 或 php5-imagick 。 php5-imagick 會給你更好的質量和 Wordpress 將使用它,如果可用。如果兩者都安裝,將使用 php5-imagick 。如果沒有安裝,圖像將不會調整大小 (WordPress 不會抱怨) 。
HTTP 可選
如果您安裝 php5-curl,它將被使用,但除了可能更好的性能之外,不需要任何東西。
WordPress 和大多數擴展都不需要任何其他功能,儘管一些擴展可能有其他要求。
以下是完整的基本安裝方式,為 WordPress 提供了最佳性能所需的所有功能,沒有任何其它功能:
apt-get install php5-fpm php5-mysqlnd php5-imagick php5-curl
第五種方案
我開發了我的 WordPress 環境檢查器。它是一個簡單的類,可以在 SAPI 或 CLI 上運行。這是維護版本 https://github.com/szepeviktor/debian-server-tools/blob/master/webserver/php-env-check.php
<?php
/**
* Check PHP environment.
*
* Usage through a webserver
* wget -q -O - "https://example.com/php-env-check.php"; echo
* Usage on CLI
* php /path/to/php-env-check.php
*
* @package php-env-check
* @version 0.2.0
* @author Viktor Szépe <viktor@szepe.net>
*/
namespace O1;
// Local access only
if ( php_sapi_name() !== 'cli' && $_SERVER['REMOTE_ADDR'] !== $_SERVER['SERVER_ADDR'] ) {
header( 'Status: 403 Forbidden' );
header( 'HTTP/1.1 403 Forbidden', true, 403 );
header( 'Connection: Close' );
exit;
}
// Remove cached version of this file
if ( function_exists( 'opcache_invalidate' ) ) {
opcache_invalidate( __FILE__ );
}
// Check environment
$check = new Check_Env();
$status = empty( $check->errors );
// Display report and exit
print json_encode( $check->errors );
exit( $status ? 0 : 1 );
/**
* Check PHP configuration.
*/
final class Check_Env {
/**
* List of errors.
*/
public $errors = array();
/**
* Run the checks.
*
* @param void
*/
public function __construct() {
// Extensions for WordPress on PHP 7.0
// http://wordpress.stackexchange.com/a/42212
// Engine version
$this->assert( 'php', 70013, PHP_VERSION_ID );
// Core directives
$this->assert_directive( 'expose_php', '' );
$this->assert_directive( 'allow_url_fopen', '' );
$this->assert_directive( 'mail.add_x_header', '' );
$this->assert_directive( 'realpath_cache_size', '64k' );
$this->assert_directive( 'max_execution_time', '30' );
$this->assert_directive( 'memory_limit', '128M' );
$this->assert_directive( 'max_input_vars', '1000' );
$this->assert_directive( 'post_max_size', '4M' );
$this->assert_directive( 'upload_max_filesize', '4M' );
// Compiled in Extensions
// php -n -m | paste -s -d " "
// Core date filter hash libxml openssl pcntl pcre Reflection session SPL standard zlib
$this->assert_extension( 'date' );
$this->assert_directive( 'date.timezone', 'Europe/Budapest' );
$this->assert_extension( 'filter' );
$this->assert_extension( 'hash' );
$this->assert_extension( 'openssl' );
$this->assert_extension( 'pcre' );
$this->assert_extension( 'SPL' );
$this->assert_extension( 'zlib' );
// Common Extensions
// dpkg -L php7.0-common | sed -n -e 's|^/usr/lib/php/S+/(S+).so$|1|p' | paste -s -d " "
// ctype iconv gettext tokenizer sockets pdo sysvsem fileinfo posix exif sysvmsg phar ftp calendar sysvshm shmop
$this->assert_extension( 'ctype' ); // wp-includes/ID3/getid3.lib.php
$this->assert_extension( 'posix' );
$this->assert_extension( 'exif' ); // wp-admin/includes/image.php
$this->assert_extension( 'ftp' );
$this->assert_extension( 'gettext' ); // _()
$this->assert_extension( 'iconv' );
$this->assert_extension( 'mbstring' );
$this->assert_extension( 'sockets' );
$this->assert_extension( 'tokenizer' );
// php7.0-json
$this->assert_extension( 'json' );
// php7.0-intl
$this->assert_extension( 'intl' );
// php7.0-xml
// wddx xml simplexml xmlwriter xmlreader dom xsl
$this->assert_extension( 'xml' );
$this->assert_extension( 'SimpleXML' );
$this->assert_extension( 'xmlreader' );
$this->assert_extension( 'dom' );
// php7.0-curl
$this->assert_extension( 'curl' );
// php7.0-gd
$this->assert_extension( 'gd' );
// php7.0-mysql
// mysqlnd mysqli pdo_mysql
// WP_USE_EXT_MYSQL will use mysqli through mysqlnd (no PDO)
$this->assert_extension( 'mysqlnd' );
$this->assert_extension( 'mysqli' );
// php7.0-opcache
$this->assert_extension( 'Zend OPcache', 'ext.opcache' );
$this->assert_directive( 'opcache.restrict_api', '/home/prg123' );
$this->assert_directive( 'opcache.memory_consumption', '256' );
$this->assert_directive( 'opcache.interned_strings_buffer', '16' );
$this->assert_directive( 'opcache.max_accelerated_files', '10000' );
// Deprecated Extensions
$this->assert_disabled_extension( 'mcrypt' );
$this->assert_disabled_extension( 'mysql' );
// Disabled Extensions
// calendar fileinfo pcntl PDO pdo_mysql Phar readline
// shmop sysvmsg(System V messages) sysvsem(System V semaphore) sysvshm(System V shared memory) wddx xmlwriter xsl
$this->assert_disabled_extension( 'calendar' );
$this->assert_disabled_extension( 'fileinfo' );
$this->assert_disabled_extension( 'pcntl' );
$this->assert_disabled_extension( 'PDO' );
$this->assert_disabled_extension( 'pdo_mysql' );
$this->assert_disabled_extension( 'Phar' );
$this->assert_disabled_extension( 'readline' );
$this->assert_disabled_extension( 'shmop' );
$this->assert_disabled_extension( 'sysvmsg' );
$this->assert_disabled_extension( 'sysvsem' );
$this->assert_disabled_extension( 'sysvshm' );
$this->assert_disabled_extension( 'wddx' );
$this->assert_disabled_extension( 'xmlwriter' );
$this->assert_disabled_extension( 'xsl' );
// php7.0-sqlite3
// pdo_sqlite sqlite3
$this->assert_disabled_extension( 'pdo_sqlite' );
$this->assert_disabled_extension( 'sqlite3' );
// 3rd-party Extensions
// php7.0-redis
$this->assert_extension( 'igbinary' );
$this->assert_extension( 'redis' );
// Not for WordPress
// Session
$this->assert_directive( 'session.gc_maxlifetime', '1440' );
}
/**
* Simple assert.
*
* @param $id string Assert ID
* @param $expected string Expected value
* @param $result string Current value
*/
private function assert( $id, $expected, $result ) {
if ( $expected !== $result ) {
$this->errors[ $id ] = $result;
}
}
/**
* Assert for a PHP extension.
*
* @param $extension_name string Extension name
* @param $id string Optional assert ID
*/
private function assert_extension( $extension_name, $id = '' ) {
// Automatic ID
if ( '' === $id ) {
$id = 'ext.' . $extension_name;
}
$this->assert( $id, true, extension_loaded( $extension_name ) );
}
/**
* Negative assert for a PHP extension.
*
* @param $extension_name string Extension name
* @param $id string Optional assert ID
*/
private function assert_disabled_extension( $extension_name, $id = '' ) {
// Automatic ID
if ( '' === $id ) {
$id = '!ext.' . $extension_name;
}
$this->assert( $id, false, extension_loaded( $extension_name ) );
}
/**
* Assert for a PHP directive.
*
* @param $directive_name string Directive name
* @param $expected string Expected value
* @param $id string Optional assert ID
*/
private function assert_directive( $directive_name, $expected, $id = '' ) {
// Automatic ID
if ( '' === $id ) {
$id = $directive_name;
}
$this->assert( $id, $expected, ini_get( $directive_name ) );
}
}
基於 @rarst 的工作
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。
