• 0

    使用 PHP 7 給 Web 應用加速

    jopen 9年前發布 | 43K 次閱讀 PHP 7

    PHP 20周年了!??

    PHP 首發通告,1995年6月8日

    發布于 COMP.INFOSYSTEMS.WWW.AUTHORING.CGI

    主題:正式宣布:個人主頁工具(Personal Home Page Tools)
    
    正式宣布個人主頁工具(PHP 工具)1.0 版本
    
    此工具是一組用 C 語言寫的輕量的 cgi 二進制文件。他們能運行許多功能,包括:
    
    - 在你的私有日志文件記錄頁面訪問情況
    - 實時查看日志信息
    - 提供查看日志信息的友好接口
    - 在你的頁面展示最近一次的訪問信息
    - 完整的每天及總體訪問統計
    - 依據用戶的域名限制其訪問
    - 依據用戶的域名為頁面提供密碼保護
    - 依據用戶的電子郵箱地址追蹤其訪問情況
    - 支持追蹤引薦 URL 的 HTTP_REFERER
    - 無需服務器支持即可運行 SSI (server-side includes)
    - 支持不記錄特定域名(比如,你自己的)的訪問信息
    - 輕易地創建并展示表格
    - 支持在后續的文檔中使用表格信息
    
    使用該工具,你不需要:
    
    - 你不需要訪問根目錄——工具安裝在 ~/public_html 目錄
    - 你不需要在服務器啟用 SSI (server-side includes)
    - 你不需要使用 Perl 或 Tcl 或其他任何腳本解釋器
    - 你不需要訪問 httpd 日志文件
    
    
    使用該工具的唯一條件是你能夠運行自己的 cgi 程序。如果你不知道這是什么意思,可以詢問系統管理員。
    
    借助該工具,你還可以在兩分鐘內實現留言板,或其他任何用于寫入信息并向訪客展示的表格。
    
    該工具不受版權限制,遵循 GNU 公共許可證。是的!該工具完全免費!
    
    查看該工具的完整演示,請訪問:http://www.io.org/~rasmus。
    
    --
    Rasmus Lerdorf
    rasmus@io.org
    http://www.io.org/~rasmus 

    用于 Web 應用的 C API

    void Cos(void) {
    Stack *s;
    char temp[64];
    
    s = Pop();
    if(!s) {
        Error("Stack error in cos");
        return;
    }
    sprintf(temp,"%f",cos(s->douval));
    Push(temp,DNUMBER);
    } 

    于是乎,你可以這樣使用它:

    <html><head><title>Cos Example</title></head>
    <body><h1>Cos Example</h1>
    <?echo Cos($input)>
    </body></html> 

    PHP7

    ? 引擎提升
    • 現實世界中的大多數應用程序都能獲得 100% 以上的性能提升
    • 內存使用量更低
    • 原生線程本地儲存
    ? 持久的以文件為基礎的二級緩存 OPCache

    使用 PHP 7 給 Web 應用加速

     ; --enable-opcache-file
        ; php.ini
        opcache.file_cache=/var/tmp
    
        ; php-cli.ini
        opcache.enable_cli=1
        opcache.file_cache=/var/tmp
        opcache.file_cache_only=1 
     $ time composer >/dev/null
        real    0m0.040s
        user    0m0.032s
        sys    0m0.004s
    
        $ time composer >/dev/null
        real    0m0.019s
        user    0m0.016s
        sys    0m0.000s
    
        $ time php -d opcache.enable=0 /usr/local/bin/composer >/dev/null
        real    0m0.033s
        user    0m0.032s
        sys    0m0.000s 
     /var/tmp
        ├── 7eeb6fe88104116c27c5650ddd83abf0
        │   └── usr
        │      └── local
        │         └── bin
        │             └── composer.bin
        └── 7eeb6fe88104116c27c5650ddd83abf0phar:
        └── usr
            └── local
                └── bin
                    └── composer
                        ├── bin
                        │   └── composer.bin
                        ├── src
                        │   ├── bootstrap.php.bin
                        │   └── Composer
                        │       ├── Command
                        │       │   ├── AboutCommand.php.bin
                        │       │   ├── ArchiveCommand.php.bin
                        │       │   ├── ClearCacheCommand.php.bin
                        │       │   ├── Command.php.bin
                        │       │   ├── ConfigCommand.php.bin
                        │       │   ├── CreateProjectCommand.php.bin
                        │       │   ├── DependsCommand.php.bin
                        │       │   ├── DiagnoseCommand.php.bin
                        │       │   ├── DumpAutoloadCommand.php.bin
                        │       │   ├── GlobalCommand.php.bin
                        │       │   ├── Helper
                        │       │   │   └── DialogHelper.php.bin
                        │       │   ├── HomeCommand.php.bin
                        │       │   ├── InitCommand.php.bin
                        │       │   ├── InstallCommand.php.bin
                        │       │   ├── LicensesCommand.php.bin
                        │       │   ├── RemoveCommand.php.bin
                        │       │   ├── RequireCommand.php.bin
                        │       │   ├── RunScriptCommand.php.bin
                        │       │   ├── SearchCommand.php.bin
                        │       │   ├── SelfUpdateCommand.php.bin
                        │       │   ├── ShowCommand.php.bin
                        │       │   ├── StatusCommand.php.bin
                        │       │   ├── UpdateCommand.php.bin
                        │       │   └── ValidateCommand.php.bin
                        │       ├── Composer.php.bin
                        │       ├── Console
                        │       │   └── Application.php.bin
                        │       ├── Factory.php.bin
                        │       ├── IO
                        │       │   ├── BaseIO.php.bin
                        │       │   ├── ConsoleIO.php.bin
                        │       │   └── IOInterface.php.bin
                        │       ├── Package
                        │       │   ├── BasePackage.php.bin
                        │       │   └── PackageInterface.php.bin
                        │       ├── Script
                        │       │   └── ScriptEvents.php.bin
                        │       └── Util
                        │           └── ErrorHandler.php.bin
                        └── vendor
                            ├── autoload.php.bin
                            ├── composer
                            │   ├── autoload_classmap.php.bin
                            │   ├── autoload_namespaces.php.bin
                            │   ├── autoload_psr4.php.bin
                            │   ├── autoload_real.php.bin
                            │   └── ClassLoader.php.bin
                            └── symfony
                                └── console
                                    └── Symfony
                                        └── Component
                                            └── Console
                                                ├── Application.php.bin
                                                ├── Command
                                                │   ├── Command.php.bin
                                                │   ├── HelpCommand.php.bin
                                                │   └── ListCommand.php.bin
                                                ├── Descriptor
                                                │   ├── ApplicationDescription.php.bin
                                                │   ├── DescriptorInterface.php.bin
                                                │   ├── Descriptor.php.bin
                                                │   ├── JsonDescriptor.php.bin
                                                │   ├── MarkdownDescriptor.php.bin
                                                │   ├── TextDescriptor.php.bin
                                                │   └── XmlDescriptor.php.bin
                                                ├── Formatter
                                                │   ├── OutputFormatterInterface.php.bin
                                                │   ├── OutputFormatter.php.bin
                                                │   ├── OutputFormatterStyleInterface.php.bin
                                                │   ├── OutputFormatterStyle.php.bin
                                                │   └── OutputFormatterStyleStack.php.bin
                                                ├── Helper
                                                │   ├── DebugFormatterHelper.php.bin
                                                │   ├── DescriptorHelper.php.bin
                                                │   ├── DialogHelper.php.bin
                                                │   ├── FormatterHelper.php.bin
                                                │   ├── HelperInterface.php.bin
                                                │   ├── Helper.php.bin
                                                │   ├── HelperSet.php.bin
                                                │   ├── InputAwareHelper.php.bin
                                                │   ├── ProcessHelper.php.bin
                                                │   ├── ProgressHelper.php.bin
                                                │   ├── QuestionHelper.php.bin
                                                │   ├── TableHelper.php.bin
                                                │   ├── Table.php.bin
                                                │   └── TableStyle.php.bin
                                                ├── Input
                                                │   ├── ArgvInput.php.bin
                                                │   ├── ArrayInput.php.bin
                                                │   ├── InputArgument.php.bin
                                                │   ├── InputAwareInterface.php.bin
                                                │   ├── InputDefinition.php.bin
                                                │   ├── InputInterface.php.bin
                                                │   ├── InputOption.php.bin
                                                │   └── Input.php.bin
                                                └── Output
                                                    ├── ConsoleOutputInterface.php.bin
                                                    ├── ConsoleOutput.php.bin
                                                    ├── NullOutput.php.bin
                                                    ├── OutputInterface.php.bin
                                                    ├── Output.php.bin
                                                    └── StreamOutput.php.bin
    
    32 級目錄, 87 個文件 
    ? 抽象語法樹!!
     echo substr("abc", [1,2]); 
     % phan -a test.php
        AST_STMT_LIST @ 1
          0: AST_STMT_LIST @ 2
            0: AST_ECHO @ 2
                0: AST_CALL @ 2
                    0: AST_NAME @ 2
                        flags: NAME_NOT_FQ (1)
                        0: "substr"
                    1: AST_ARG_LIST @ 2
                        0: "abc"
                        1: AST_ARRAY @ 2
                            0: AST_ARRAY_ELEM @ 2
                                flags: 0
                                0: 1
                                1: null
                            1: AST_ARRAY_ELEM @ 2
                                flags: 0
                                0: 2
                                1: null 
     % phan -a test.php
        test.php:2 TypeError arg#2(start) is int[] but substr() takes int 
    ? 返回類型
    function get_config(): array {
         return 42;
    }
    get_config();
    
    
    // 可捕獲的致命錯誤:get_config() 的返回值必須是數組類型,此處返回了整數。 
    ? 強制標量類型
    function logmsg(string $msg, int $level, float $severity) {  
        var_dump($msg);      // string(1) "1"
        var_dump($level);    // int(2)
        var_dump($severity); // float(3)
    }
    logmsg(1, "2.5", 3); 
    ? 嚴格標量類型
    declare(strict_types=1);
    
    logmsg(1, "2.5", 3); 
    致命錯誤:傳給 logmsg() 的首個參數必須是字符串類型,此處是整型。 
    ? 匿名類
    return new class($controller) implements Page {  
        public function __construct($controller) {
            /* ... */
        }
        /* ... */
    };
    
    class MyObject extends MyStuff {  
        public function getInterface() {
            return new class implements MyInterface {
                /* ... */
            };
        }
    } 
    ? Null 合并操作符
    $a = NULL;
    $b = 1;
    $c = 2;
    
    echo $a ?? $b; // 1  
    echo $c ?? $b; // 2  
    echo $a ?? $b ?? $c; // 1  
    echo $a ?? $x ?? $c; // 2 
    ? 飛船操作符 (Spaceship Operator)
    |=|  Tie Fighter
    k=k  Tie Interceptor  
    <==> Tie Bomber  
    <=>  Tie Advanced X1 ? 
    function cmp_php5($a, $b) {  
        return ($a < $b) ? -1 : (($a >$b) ? 1 : 0);
    }
    
    function cmp_php7($a, $b) {  
        return $a <=> $b;
    } 
    ? 致命錯誤中的特例
    function call_method($obj) {  
        $obj->method();
    }
    
    call_method(null);  
    // 致命錯誤:非對象調用了成員函數 method() 
    try {  
        call_method(null);
    } catch (EngineException $e) {
        echo "Exception: {$e->getMessage()}\n";
    }
    // Exception: Call to a member function method() on a non-object
    //特例:非對象調用了成員函數 method() 
    ? 零成本斷言
    function test($arg) {  
        assert($arg > 20 && $arg < 110, "$arg is invalid");
    }
    ini_set('zend.assertions',0); test(16);  
    ini_set('zend.assertions',1); test(17);  
    ini_set('assert.exception',1); test(18); 
    Warning: assert(): 17 is invalid failed in /home/rasmus/assert.php on line 3  
    Fatal error: Uncaught AssertionError: 18 is invalid in /home/rasmus/assert.php:3  
    Stack trace:  
    #0 /home/rasmus/assert.php(3): assert(false, '18 is invalid')
    #1 /home/rasmus/assert.php(13): test(18)
    #2 {main}
      thrown in /home/rasmus/assert.php on line 3 
    ; Completely skip compiling assert() calls
    ; (can only be set in php.ini)
    zend.assertions = -1 
    ? 新增 Closure::call()
    $f = function () {
        return $this->n;
    };
    class MyClass {  
        private $n = 42;
    }
    $myC = new MyClass;
    $c = $f->bindTo($myC, "MyClass");
    $c(); 
    $f = function () {
        return $this->n;
    };
    class MyClass {  
        private $n = 42;
    }
    $myC = new MyClass;
    $f->call($myC); 
    ? 移除諸多棄用功能
     (PHP 4 代碼將會崩潰!) 
    - ext/ereg (use ext/pcre instead)
    - preg_replace() eval modifier (use preg_replace_callback() instead)
    - ext/mysql (use ext/mysqli or ext/pdo_mysql instead)
    - Assignment of new by reference
    - Scoped calls of non-static methods from incompatible $this context
    
    - dl() in php-fpm
    - set_magic_quotes_runtime() and magic_quotes_runtime()
    - set_socket_blocking() (use stream_set_blocking() instead)
    - mcrypt_generic_end() (use mcrypt_generic_deinit() instead)
    - mcrypt_ecb, mcrypt_cbc, mcrypt_cfb and mcrypt_ofb 
      (use mcrypt_encrypt() and mcrypt_decrypt() instead)
    - datefmt_set_timezone_id() and IntlDateFormatter::setTimeZoneID() 
      (use datefmt_set_timezone() or IntlDateFormatter::setTimeZone() instead)
    
    - xsl.security_prefs (use XsltProcessor::setSecurityPrefs() instead)
    - iconv.input_encoding, iconv.output_encoding, iconv.internal_encoding,
      mbstring.http_input, mbstring.http_output and mbstring.internal_encoding
      (use php.input_encoding, php.internal_encoding and php.output_encoding instead)
    
    - $is_dst parameter of the mktime() and gmmktime() functions
    - # style comments in ini files (use ; style comments instead)
    - String category names in setlocale() (use LC_* constants instead)
    - Unsafe curl file uploads (use CurlFile instead)
    - PDO::PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT driver option 
      (use PDO::ATTR_EMULATE_PREPARES instead)
    - CN_match and SNI_server_name stream context option (use peer_name instead) 
    ? 新的保留字:
    • bool
    • int
    • float
    • string
    • null
    • false
    • true
    • resource
    • object
    • mixed
    • numeric
    ? Windows 系統下支持64位整數
    ? 清除邊緣情況下整型溢出/下溢、
    ? 在64位版本中支持長度大于 2^31 字節的字符串
    ? 無效數值型解析錯誤
    $mask = 0855;  // 解析錯誤:無效的數值型 
    ? 統一變量語法
    // 從左到右
    $this->$belongs_to['column']
    // 從右到左
    $this->{$belongs_to['column']}
    
    // 支持缺失的操作組合
    $foo()['bar']()
    [$obj1, $obj2][0]->prop
    getStr(){0}
    
    // 支持嵌套的 ::
    $foo['bar']::$baz
    $foo::$bar::$baz
    $foo->bar()::baz()
    
    // 支持嵌套的 ()
    foo()()  
    $foo->bar()()
    Foo::bar()()  
    $foo()()
    
    // 支持對任意(...)表達式的操作
    (...)['foo']
    (...)->foo
    (...)->foo()
    (...)::$foo
    (...)::foo()
    (...)()
    
    // 針對上一點,兩個更加實用的例子
    (function() { ... })()
    ($obj->closure)()
    
    // 支持對 dereferencable 標量的所有操作
    // (用處不是很大)
    "string"->toLower()
    [$obj, 'method']()
    'Foo'::$bar 
    echo preg_replace('/:-:(.*?):-:/e', '$this->pres->\\1', $text); 
    echo preg_replace_callback(  
        '/:-:(.*?):-:/', 
        function($matches) {
          return $this->pres->$matches[1]; // Oops!
        },
        $text); 
    % phan -b display.php
    Files scanned: 1  
    Time:        0.13s  
    Classes:    8  
    Methods:    55  
    Functions:    5  
    Closures:    5  
    Traits:        0  
    Conditionals:    307  
    Issues found:    1
    
    display.php:416 CompatError expression may not be PHP 7 compatible 
    echo preg_replace_callback(  
        '/:-:(.*?):-:/', 
        function($matches) {
          return $this->pres->{$matches[1]}; // Ok
        },
        $text); 

    ? Unicode 碼點轉義語法

    echo "\u{202E}Right-to-left text";
    
    echo "\u{1F602}"; 

    ?Right-to-left text??

    ? ICU IntlChar 類加入 intl 擴展


    通用版本預計在2015年10月發布


    針對 Wordpress-3.6.0 首頁100次請求的耗時與機器指令數量

    使用 PHP 7 給 Web 應用加速

    • zval 的大小從24字節減小到16字節
    • 哈希表大小從72字節減小到56字節
    • 哈希表 bucket 大小從72字節減小到32字節
    • 定長數組優化
    $a = [];
    for($i=0; $i < 100000;$i++) $a[] = ['abc'];  
    echo memory_get_usage(true);  
    // PHP 5.x  43M
    // PHP 7.0  6M 
    • CPU 緩存更大更友好
    • 與 jemalloc 相似的內存分配器
    • 更快的哈希表迭代 API
    • 數組復制優化
    • 默認啟用 PCRE JIT
    • 快速的 ZPP (ZendParseParameters) 執行
    • 更快的棧分配 zvals(而不是堆)
    • 優化的 VM 調用
    • gcc 4.8+ 中的全局寄存器變量
    • 加上數百處微優化

    運行時編譯執行(JIT)?

    謊話,彌天大謊,還有基準測試

    測試箱規格

    • Gigabyte Z87X-UD3H i7-4771 4 cores @ 3.50GHz w/ 16G of Ram @ 1600MHz
    • 啟用超線程的八個虛擬核
    • Toshiba THNSNHH256GBST SSD
    • Linux debian 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt9-2 (2015-04-13) x86_64 GNU/Linux
    • MySQL 5.6.24
    • 如無特別指出,所有測試使用 nginx-1.6.2 + php-fpm
    • 本地 100Mbps 網絡連接
    • 對獨立機器進行圍攻基準測試(siege benchmark)

    所有 PHP 版本均在本地使用 gcc-4.9.2 -O2 編譯

    配置標志

    ./configure --disable-debug       --with-apxs2=/usr/bin/apxs2 \
                --enable-zend-signals --with-gd \
                --without-pear        --with-jpeg-dir=/usr \
                --with-png-dir=/usr   --with-vpx-dir=/usr \
                --with-t1lib=/usr     --with-freetype-dir=/usr \
                --enable-exif         --enable-gd-native-ttf \
                --with-zlib           --with-mysql=/usr \
                --with-gmp            --with-zlib-dir=/usr \
                --with-gettext        --with-kerberos \
                --with-imap-ssl       --with-mcrypt=/usr/local \
                --with-iconv          --enable-sockets \
                --with-openssl        --with-pspell \
                --with-pdo-sqlite     --with-pdo-mysql=mysqlnd \
                --enable-soap         --enable-xmlreader \
                --enable-phar=shared  --with-xsl \
                --enable-ftp          --enable-cgi \
                --with-curl=/usr      --with-tidy \
                --with-xmlrpc         --enable-mbstring \
                --enable-sysvsem      --enable-sysvshm \
                --enable-shmop        --with-readline \
                --enable-pcntl        --enable-fpm \
                --enable-intl         --enable-zip \
                --with-imap           --with-mysqli=mysqlnd \
                --enable-calendar     --prefix=/usr/local \
                --with-mysql-sock=/var/run/mysqld/mysqld.sock \
                --with-config-file-scan-dir=/etc/php7/conf.d \
                --with-config-file-path=/etc/php7 

    php.ini

    [PHP]
    zend.multibyte=On  
    date.timezone="America/Los_Angeles"  
    display_startup_errors=On  
    zend.enable_gc=Off  
    include_path="/usr/local/lib/php"  
    default_charset="UTF-8"  
    error_reporting=-1
    
    variables_order=GPCS  
    sendmail_path=""
    
    max_execution_time=60  
    memory_limit=512M  
    post_max_size=1024M  
    cgi.force_redirect=0  
    cgi.fix_pathinfo=1
    
    magic_quotes=0  
    magic_quotes_gpc=0  
    user_ini.filename=  
    realpath_cache_size=2M  
    cgi.check_shebang_line=0
    
    max_input_vars=1000  
    max_file_uploads=50
    
    zend_extension=opcache.so  
    opcache.enable=1  
    opcache.memory_consumption=256  
    opcache.interned_strings_buffer=8  
    opcache.max_accelerated_files=10000  
    opcache.revalidate_freq=60  
    opcache.fast_shutdown=1  
    opcache.enable_cli=1 

    php-fpm.d/www.conf

    [www]
    user = www-data  
    group = www-data  
    listen = /var/run/php-fpm.sock  
    listen.owner = www-data  
    listen.group = www-data  
    listen.mode = 0660
    
    pm = static  
    pm.max_children = 10  
    pm.status_path = /status  
    ping.path = /ping  
    ping.response = pong 

    nginx.conf

    user www-data;  
    worker_processes 4;  
    pid /var/run/nginx.pid;
    
    events {  
            worker_connections 768;
    }
    
    http {  
            sendfile on;
            tcp_nopush on;
            tcp_nodelay on;
            keepalive_timeout 65;
            types_hash_max_size 2048;
    
            include /etc/nginx/mime.types;
            default_type application/octet-stream;
    
            access_log /var/log/nginx/access.log;
            error_log /var/log/nginx/error.log;
    
            gzip on;
            gzip_disable "msie6";
    
            include /etc/nginx/conf.d/*.conf;
            include /etc/nginx/sites-enabled/*;
    } 

    php.conf

    location ~ \.php {  
      include                  fastcgi_params;
      fastcgi_keep_conn        on;
      fastcgi_index            index.php;
      fastcgi_split_path_info  ^(.+\.php)(/.+)$;
      fastcgi_param PATH_INFO  $fastcgi_path_info;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_intercept_errors on;
      fastcgi_pass             unix:/var/run/php-fpm.sock;
    } 

    hhvm.conf

    location ~ \.php$ {  
      include           fastcgi_params;
      fastcgi_keep_conn on;
      fastcgi_pass      unix:/var/run/hhvm/server.sock;
      fastcgi_index     index.php;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    } 

    sites-enabled/wordpress

    server {  
        listen 80;
        server_name wordpress;
        root /var/www/wordpress;
        access_log /var/log/nginx/wordpress-access.log;
        error_log /var/log/nginx/wordpress-error.log;
    
        location / {
            index     index.html index.htm index.php;
            autoindex on;
        }
    
        location ~ /\.  { return 403; }
    
        include backend.conf;
    } 

    HipHop VM 3.7.0 (rel) from http://dl.hhvm.com/ubuntu

    server.ini
    pid = /var/run/hhvm/pid  
    hhvm.server.file_socket = /var/run/hhvm/server.sock  
    hhvm.server.type = fastcgi  
    hhvm.server.default_document = index.php  
    hhvm.log.use_log_file = true  
    hhvm.log.file = /var/log/hhvm/error.log  
    hhvm.repo.central.path = /var/run/hhvm/hhvm.hhbc 
    php.ini
    session.save_handler = files  
    session.save_path = /var/lib/php5  
    session.gc_maxlifetime = 1440
    
    hhvm.log.level = Warning  
    hhvm.log.always_log_unhandled_exceptions = true  
    hhvm.log.runtime_error_reporting_level = 8191  
    hhvm.mysql.typed_results = false 

    Drupal 8-git

    使用 PHP 7 給 Web 應用加速

    Wordpress-4.1.1

    http://wordpress/?p=1

    使用 PHP 7 給 Web 應用加速

    GCC 反饋制導優化(Feedback-Directed Optimization, FDO)

    $ make clean
    $ make -j8 prof-gen
    ...
    $ sapi/cgi/php-cgi -T 1000 /var/www/wordpress/index.php > /dev/null
    $ make prof-clean
    $ make -j8 prof-use 

    Wordpress-4.1.1

    http://wordpress/?p=1

    使用 PHP 7 給 Web 應用加速

    phpBB 3.1.3

    http://phpbb/viewforum.php?f=2

    使用 PHP 7 給 Web 應用加速

    MediaWiki 1.24.1

    默認首頁

    使用 PHP 7 給 Web 應用加速

    Opencart 2.0.2.0

    默認安裝下的首頁

    使用 PHP 7 給 Web 應用加速

    WardrobeCMS 1.2.0

    包含一篇短文的首頁

    使用 PHP 7 給 Web 應用加速

    Geeklog 2.1.0

    默認首頁

    使用 PHP 7 給 Web 應用加速

    Magento-1.9.1.1

    http://magento/index.php/sale.html (sample data)

    使用 PHP 7 給 Web 應用加速

    Traq 3.5.2

    http://traq/test/tickets/1

    使用 PHP 7 給 Web 應用加速

    Had to fix one line of code in the Avalon database library:

    diff --git a/database/model.php b/database/model.php  
    index 6c5f7da..c93e726 100644  
    --- a/database/model.php
    +++ b/database/model.php
    @@ -397,7 +397,7 @@ public function __get($var) {
               $belongs_to['column'] = $var . '_id';
           }
           $model = $belongs_to['model'];
    -      return $this->$var = $model::find($belongs_to['foreign_key'], $this->$belongs_to['column']);
    +      return $this->$var = $model::find($belongs_to['foreign_key'], $this->{$belongs_to['column']});
       } else {
           $val = $this->$var; 

    Cachet

    包含一件事件的首頁

    使用 PHP 7 給 Web 應用加速

    Moodle-2.9-dev

    點擊默認的首頁

    使用 PHP 7 給 Web 應用加速

    ZenCart 1.5.4

    包含演示數據的首頁

    使用 PHP 7 給 Web 應用加速

    OneAPM for PHP 能夠深入到所有 PHP 應用內部完成應用性能管理和監控,包括代碼級別性能問題的可見性、性能瓶頸的快速識別與追溯、真實用戶體驗監控、服務器監控和端到端的應用性能管理。

    幫我們一起測試!

    它真的簡單易用!

    安裝 Vagrant 與 Virtualbox

    之后:

    $ git clone https://github.com/rlerdorf/php7dev.git
    
    $ cd php7dev
    
    $ vagrant up
    ... (takes a bit - it is downloading 1.5G)
    
    $ vagrant ssh 

    它會 NAT, DHCP 并產生固定的地址 192.168.7.7

    http://192.168.7.7/ 會展示 PHP 7 的 phpinfo() 頁面。

    現在,你的開發環境就部署好啦。

    切換 PHP 版本比較繁雜:

    vagrant@php7dev:~$ newphp 56  
    Activating PHP 5.6.6-dev and restarting php-fpm
    
    vagrant@php7dev:~$ newphp 7 debug  
    Activating PHP 7.0.0-dev and restarting php-fpm 

    20 個預編譯的版本

    /usr/local/php53            /usr/local/php54-zts        /usr/local/php56-debug-zts
    /usr/local/php53-debug      /usr/local/php55            /usr/local/php56-zts
    /usr/local/php53-debug-zts  /usr/local/php55-debug      /usr/local/php70
    /usr/local/php53-zts        /usr/local/php55-debug-zts  /usr/local/php70-debug
    /usr/local/php54            /usr/local/php55-zts        /usr/local/php70-debug-zts
    /usr/local/php54-debug      /usr/local/php56            /usr/local/php70-zts
    /usr/local/php54-debug-zts  /usr/local/php56-debug 

    構建任意版本:

    $ makephp 7
    Build log in /tmp/build.log  
    Building PHP 7.0  
    configuring...  
    compiling...  
    installing...  
    done  
    Building PHP 7.0-debug  
    configuring...  
    compiling...  
    installing...  
    done 

    或手動地

    $ cd php-src
    $ git checkout PHP-5.6
    $ git pull -r
    $ make distclean
    $ ./buildconf -f
    $ ./cn56
    $ make
    $ sudo make install 

    github.com/rlerdorf/php7dev

    請向我們提交 bug!

    原文鏈接 http://talks.php.net/taiwan15

     本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
     轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
     本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!
  • sesese色