问题描述

Codex loosely only mentions PHP version in server requirements,但 PHP 可以配置在不同的范围内,包括不同的部分。

什么是扩展/库:

  1. WP 是否需要工作? MySQL …
  2. 需要具体的功能? GD?
  3. 最适合运作的具体功能?卷曲…
  4. 是插件常用吗?压缩…

最佳解决方案

我给了这个更多的想法和给定的 WP 代码库 (包括捆绑库) 的大小,似乎并不现实的手工编译这样的列表 (并重复它为每个新版本 – meh) 。

我查找了适当的静态代码分析工具–PHP_CompatInfo,并且在核心扩展使用的报告 (版本扫描 3.3.1) 之后生成了一些修补之后:

  •  cURL – 127 使用 (需要 libcurl)

    • HTTP API(WP_Http_curl 类)
    •  url_is_accessable_via_ssl()
    • SimplePie(用 WP_SimplePie_File 类覆盖)
    • GoogleSpell(来自 TinyMCE 包,是不是用?)
  •  Date/Time – 367 使用
  •  DOM – 6 用途 (需要 libxml)

    •  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-php5libapache2-mod-php5filterphp5-cgiphp5-fpm 。我选择 php5-fpm,但这一切都取决于您希望您的 Web 服务器和 PHP 进行交互。

MySQL

你也需要 PHP 来使用 MySQL 。您的选项是 php5-mysqlphp5-mysqlnd 。 php5-mysqlnd 是本机的,通常更快。有些人可能会选择像 MariaDB 这样的选择。

图形库可选

如果要使图像调整大小,可以安装 php5-gdphp5-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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。