BILIBIBI

PHP7 升级笔记

好久没折腾这些东西了,今天闲的没事上官网看了下发现PHP7出来了,就装上了

wget http://hk1.php.net/get/php-7.0.0.tar.gz/from/this/mirror
wget http://hk2.php.net/get/php-7.0.0.tar.gz/from/this/mirror
wget http://php.net/get/php-7.0.0.tar.gz/from/this/mirror
wget http://sg2.php.net/get/php-7.0.0.tar.gz/from/this/mirror
wget http://sg3.php.net/get/php-7.0.0.tar.gz/from/this/mirror
wget http://au1.php.net/get/php-7.0.0.tar.gz/from/this/mirror
wget http://docs.php.net/get/php-7.0.0.tar.gz/from/this/mirror
(试了N个服务器都不好使,最后下载到本机然后上传上去的)
ls
tar -xzvf php-7.0.0.tar.gz
ls
cd php-7.0.0
ls
./configure --help > help.txt
./configure --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx --disable-ipv6 --with-zlib --with-curl --with-gd --enable-mbstring --with-mysqli --enable-zip
make
service php-fpm stop
make install
cp /root/php-7.0.0/php.ini-production /usr/local/lib/php.ini
cp /root/php-7.0.0/sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm
cp /usr/local/etc/php-fpm.d/www.conf.default /usr/local/etc/php-fpm.conf
cp sapi/fpm/php-fpm /usr/local/bin
service php-fpm start

于是,出现了一个非常蛋疼的情况

[root@iZ2318ey39rZ ~]# pecl install mysql
No releases available for package "pecl.php.net/mysql"
install failed

MySQL扩展不见了∑(っ °Д °;)っ
好吧,现在就两条路可走了:换PDO、改成MySQLi
PDO没接触过,所以我选择了后者
/var/Typecho/Db/Adapter/Mysql.php:

<?php
if (!defined('__TYPECHO_ROOT_DIR__')) exit;
/**
 * Typecho Blog Platform
 *
 * @copyright  Copyright (c) 2008 Typecho team (http://www.typecho.org)
 * @license    GNU General Public License 2.0
 * @version    $Id: Mysql.php 103 2008-04-09 16:22:43Z magike.net $
 */

/**
 * 数据库Mysql适配器
 *
 * @package Db
 */
class Typecho_Db_Adapter_Mysql implements Typecho_Db_Adapter
{
    /**
     * 数据库连接字符串标示
     *
     * @access private
     * @var resource
     */
    private $_dbLink;

    /**
     * 判断适配器是否可用
     *
     * @access public
     * @return boolean
     */
    public static function isAvailable()
    {
        return function_exists('mysqli_connect');
    }

    /**
     * 数据库连接函数
     *
     * @param Typecho_Config $config 数据库配置
     * @throws Typecho_Db_Exception
     * @return resource
     */
    public function connect(Typecho_Config $config)
    {
        if ($this->_dbLink = new mysqli($config->host . (empty($config->port) ? '' : ':' . $config->port),
        $config->user, $config->password,$config->database)) {
            if ($config->charset) {
               $this->_dbLink->set_charset($config->charset);
            }
                return $this->_dbLink;
        }

        /** 数据库异常 */
        throw new Typecho_Db_Adapter_Exception(@$this->_dbLink->error);
    }

    /**
     * 执行数据库查询
     *
     * @param string $query 数据库查询SQL字符串
     * @param mixed $handle 连接对象
     * @param integer $op 数据库读写状态
     * @param string $action 数据库动作
     * @throws Typecho_Db_Exception
     * @return resource
     */
    public function query($query, $handle, $op = Typecho_Db::READ, $action = NULL)
    {
        if ($resource = @$handle->query($query instanceof Typecho_Db_Query ? $query->__toString() : $query)) {
            return $resource;
        }

        /** 数据库异常 */
        throw new Typecho_Db_Query_Exception(@$this->_dbLink->error,$this->_dbLink->errno);
    }

    /**
     * 将数据查询的其中一行作为数组取出,其中字段名对应数组键值
     *
     * @param resource $resource 查询返回资源标识
     * @return array
     */
    public function fetch($resource)
    {
        return $resource->fetch_assoc();
    }

    /**
     * 将数据查询的其中一行作为对象取出,其中字段名对应对象属性
     *
     * @param resource $resource 查询的资源数据
     * @return object
     */
    public function fetchObject($resource)
    {
        return $resource->fetch_object();
    }

    /**
     * 引号转义函数
     *
     * @param string $string 需要转义的字符串
     * @return string
     */
    public function quoteValue($string)
    {
        return '\'' . str_replace(array('\'', '\\'), array('\'\'', '\\\\'), $string) . '\'';
    }

    /**
     * 对象引号过滤
     *
     * @access public
     * @param string $string
     * @return string
     */
    public function quoteColumn($string)
    {
        return '`' . $string . '`';
    }

    /**
     * 合成查询语句
     *
     * @access public
     * @param array $sql 查询对象词法数组
     * @return string
     */
    public function parseSelect(array $sql)
    {
        if (!empty($sql['join'])) {
            foreach ($sql['join'] as $val) {
                list($table, $condition, $op) = $val;
                $sql['table'] = "{$sql['table']} {$op} JOIN {$table} ON {$condition}";
            }
        }

        $sql['limit'] = (0 == strlen($sql['limit'])) ? NULL : ' LIMIT ' . $sql['limit'];
        $sql['offset'] = (0 == strlen($sql['offset'])) ? NULL : ' OFFSET ' . $sql['offset'];

        return 'SELECT ' . $sql['fields'] . ' FROM ' . $sql['table'] .
        $sql['where'] . $sql['group'] . $sql['having'] . $sql['order'] . $sql['limit'] . $sql['offset'];
    }

    /**
     * 取出最后一次查询影响的行数
     *
     * @param resource $resource 查询的资源数据
     * @param mixed $handle 连接对象
     * @return integer
     */
    public function affectedRows($resource, $handle)
    {
        return $handle->affected_rows;
    }

    /**
     * 取出最后一次插入返回的主键值
     *
     * @param resource $resource 查询的资源数据
     * @param mixed $handle 连接对象
     * @return integer
     */
    public function lastInsertId($resource, $handle)
    {
        return $handle->insert_id;
    }
}

另外,PHP7的异常需要用Throwable而不是Exception,我在这里卡了半个多小时
/var/Typecho/Common.php:235

<?php
//非完整PHP代码
public static function exceptionHandle(Throwable $exception)

Typecho可以用了,Discuz!我是没辙了,都折腾一下午了还是打不开,Git上面分享的适配也不好用,现在服务器上跑两个PHP

标签: none

添加新评论