0

0

php mysql备份恢复分卷处理

php中文网

php中文网

发布时间:2016-05-25 16:37:46

|

1135人浏览过

|

来源于php中文网

原创

分卷处理就是把握们要处理的数据分成一个个小文件进行处理了,下面我来给大家介绍一个php mysql备份恢复分卷处理类,实现mysql数据库分卷备份,选择表进行备份,实现单个sql文件及分卷sql导入.

分卷导入类及思路详解

数据库导入导出是一个后台必要拥有的功能,网上一搜,有很多关于数据库导入导出的,但基本上一个大的系统,包含了许多我们并不需要的,而且他们都是自己的后台的形式,我并不喜欢的是拿人家的东西整合到自己的后台,我需要的是自己东西,于是参照了很多,自己写了一个关于分卷导入类,以方便调用,欢迎大家拍砖.

这里针对分卷文件是以‘_v1.sql’为结尾,实现单个sql文件及分卷sql导入,分卷导入可选择是否当前分卷导入余下分卷,我们只需要直接调用类即可完成.

分别是主机,用户名,密码,数据库名,数据库编码

立即学习PHP免费学习笔记(深入)”;

$db = new DataManage ( 'localhost', 'root', 'root', 'test', 'utf8' );

sql文件,是否只导入单个sql(即如果有其他分卷也不导入).

$db->restore ( './backup/20120516211738_all_v1.sql', false );对应如何去列出备份的sql文件或选择sql之类的,自己去实现,那个不在这个范畴了,也很简单的.

还有目前只实现了数据库导入,关于数据库导出的,正在编写功能,下面是完整的类代码,具体思路及实现代码里面都有说明,这里不在赘述,代码如下:

restore ( './backup/20120516211738_all_v1.sql', false ); 
	 *---------------------------------------------------------------------- 
	 */ 
	class DataManage { 
	 var $db; // 数据库连接 
	 var $database; // 所用数据库 
	 var $sqldir; // 数据库备份文件夹 
	 
	 /** 
	  * 初始化 
	  * 
	  * @param string $host 
	  * @param string $username 
	  * @param string $password 
	  * @param string $database 
	  * @param string $charset 
	  */ 
	 function __construct($host = 'localhost', $username = 'root', $password = '', $database = 'test', $charset = 'utf8') { 
	  $this->host = $host; 
	  $this->username = $username; 
	  $this->password = $password; 
	  $this->database = $database; 
	  $this->charset = $charset; 
	  // 连接数据库 
	  $this->db = mysql_connect ( $this->host, $this->username, $this->password ) or die ( "数据库连接失败." ); 
	  // 选择使用哪个数据库 
	  mysql_select_db ( $this->database, $this->db ) or die ( "无法打开数据库" ); 
	  // 数据库编码方式 
	  mysql_query ( 'SET NAMES ' . $this->charset, $this->db ); 
	 } 
	 
	 /** 
	  * 导入备份数据 
	  * 说明:分卷文件格式20120516211738_all_v1.sql 
	  * 
	  * @param string $sqlfile 
	  * @param bool $single 
	  */ 
	 function restore($sqlfile, $single = FALSE) { 
	  // 检测文件是否存在 
	  if (! file_exists ( $sqlfile )) { 
	   exit ( "文件不存在!请检查" ); 
	  } 
	  $this->lock ( $this->database ); 
	  // 获取数据库存储位置 
	  $sqlpath = pathinfo ( $sqlfile ); 
	  $this->sqldir = $sqlpath ['dirname']; 
	  // 检测是否包含分卷,将类似20120516211738_all_v1.sql从_v分开,有则说明有分卷 
	  $volume = explode ( "_v", $sqlfile ); 
	  $volume_path = $volume [0]; 
	  echo "请勿刷新及关闭浏览器以防止程序被中止,如有不慎!将导致数据库结构受损
"; echo "正在导入备份数据,请稍等!
"; if (emptyempty ( $volume [1] ) || $single) { echo "正在导入sql:" . $sqlfile . '
'; // 没有分卷 if ($this->_import ( $sqlfile )) { echo "数据库导入成功!"; } else { exit ( '数据库导入失败!' ); } } else { // 存在分卷,则获取当前是第几分卷,循环执行余下分卷 $volume_id = explode ( ".sq", $volume [1] ); // 当前分卷为$volume_id $volume_id = intval ( $volume_id [0] ); while ( $volume_id ) { $tmpfile = $volume_path . "_v" . $volume_id . ".sql"; // 存在其他分卷,继续执行 if (file_exists ( $tmpfile )) { // 执行导入方法 echo "正在导入分卷$volume_id:" . $tmpfile . '
'; if ($this->_import ( $tmpfile )) { } else { exit ( "导入分卷$volume_id:" . $tmpfile . '失败!可能是数据库结构已损坏!请尝试从分卷1开始导入' ); } } else { echo "此分卷备份全部导入成功!
"; return; } $volume_id ++; } } } /** * 将sql导入到数据库(普通导入) * * @param string $sqlfile * @return boolean */ private function _import($sqlfile) { $name = basename ( $sqlfile ); $sqls = file ( $sqlfile ); foreach ( $sqls as $sql ) { str_replace ( "r", "", $sql ); str_replace ( "n", "", $sql ); if (! mysql_query ( trim ( $sql ), $this->db )) return false; } return true; } // 关闭数据库连接 private function close() { mysql_close ( $this->db ); } // 锁定数据库,以免备份或导入时出错 private function lock($tablename, $op = "WRITE") { if (mysql_query ( "lock tables " . $tablename . " " . $op )) return true; else return false; } // 解锁 private function unlock() { if (mysql_query ( "unlock tables" )) return true; else return false; } // 析构 function __destruct() { mysql_query ( "unlock tables", $this->db ); mysql_close ( $this->db ); } }

mysql备份恢复分卷处理,调用简单.

分卷导入思路:按行读取sql文件,将每一行当作完整的sql语句存到数组再循环执行插入数据库就可以了,但是在创建表语句分了多行,这个需要单独处理,就这个花了我好长时间的.感觉文章好长啊,主要是那个类文件给占用了.

天意易趣网拍卖系统
天意易趣网拍卖系统

前台主要功能:首选服务 注销登陆 查看使用帮助 修改添加登陆帐号拍卖商品管理 管理拍卖商品 推荐拍卖商品 删除特定拍卖 已经结束商品 拍卖分类管理 新闻管理 添加文章 删除修改 栏目管理 新闻CSS设定 新闻JS生成 初始化新闻 参数设置 用户管理 未审核用户管理 普通用户管理 高级用户管理 黄金用户管理 管理所有用户 数据库管理 压缩数据库 备份数据库 恢复数据库 批量处理 系统指标测试V1.

下载

更新说明: 

1.去除sql导入的时候排除sql文件里面的注释’– ‘ 从而解决sql中单双引号不能导入

2.单行读取后的sql直接执行,避免重新将sql语句组合到数组中再从数组中读取导入sql,提高效率.

下载地址: https://github.com/yanue/Dbmanage

导出后的sql文件格式如下:

-- 
	-- MySQL database dump 
	-- Created by DBManage class, Power By yanue.  
	-- 
	-- 主机: localhost 
	-- 生成日期: 2012 年  10 月 06 日 22:32 
	-- MySQL版本: 5.1.50-community 
	-- PHP 版本: 5.3.9-ZS5.6.0 
	 
	-- 
	-- 数据库: `test` 
	-- 
	 
	-- ------------------------------------------------------- 
	 
	-- 
	-- 表的结构aa 
	-- 
	 
	DROP TABLE IF EXISTS `aa`; 
	CREATE TABLE `aa` ( 
	  `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
	  `content` text NOT NULL, 
	  PRIMARY KEY (`id`) 
	) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; 
	 
	-- 
	-- 转存表中的数据 aa 
	-- 
	 
	INSERT INTO `aa` VALUES('1','

我是测试数据 呵呵

');

下面是类代码:


	/** 
 * @author yanue 
 * @copyright  Copyright (c) 2012 yanue.net 
 * @link  http://phprm.com 
 * @version 1.1 
 * 创建时间: 2012年5月21日 
 
更新时间: 2012年10月6日 
更新说明: 1.去除sql导入的时候排除sql文件里面的注释'-- ' 从而解决sql中单双引号不能导入 
2.单行读取后的sql直接执行,避免重新将sql语句组合到数组中再从数组中读取导入sql,提高效率 
 
 * 说明:分卷文件是以_v1.sql为结尾(20120522021241241_all_v1.sql) 
 * 功能:实现mysql数据库分卷备份,选择表进行备份,实现单个sql文件及分卷sql导入 
 * 使用方法: 
 * 
 * ------1. 数据库备份(导出)------------------------------------------------------------ 
//分别是主机,用户名,密码,数据库名,数据库编码 
$db = new DBManage ( 'localhost', 'root', 'root', 'test', 'utf8' ); 
// 参数:备份哪个表(可选),备份目录(可选,默认为backup),分卷大小(可选,默认2000,即2M) 
$db->backup (); 
 * ------2. 数据库恢复(导入)------------------------------------------------------------ 
//分别是主机,用户名,密码,数据库名,数据库编码 
$db = new DBManage ( 'localhost', 'root', 'root', 'test', 'utf8' ); 
//参数:sql文件 
$db->restore ( './backup/20120516211738_all_v1.sql'); 
 *---------------------------------------------------------------------- 
 */ 
class DbManage { 
    var $db; // 数据库连接 
    var $database; // 所用数据库 
    var $sqldir; // 数据库备份文件夹 
    // 换行符 
    private $ds = "n"; 
    // 存储SQL的变量 
    public $sqlContent = ""; 
    // 每条sql语句的结尾符 
    public $sqlEnd = ";"; 
 
    /** 
     * 初始化 
     * 
     * @param string $host 
     * @param string $username 
     * @param string $password 
     * @param string $database 
     * @param string $charset 
     */ 
    function __construct($host = 'localhost', $username = 'root', $password = '', $database = 'test', $charset = 'utf8') { 
        $this->host = $host; 
        $this->username = $username; 
        $this->password = $password; 
        $this->database = $database; 
        $this->charset = $charset; 
        set_time_limit(0);//无时间限制 
@ob_end_flush(); 
        // 连接数据库 
        $this->db = @mysql_connect ( $this->host, $this->username, $this->password ) or die( '

Mysql Connect Error : '.mysql_error().'

'); 
        // 选择使用哪个数据库 
        mysql_select_db ( $this->database, $this->db ) or die('

Mysql Connect Error:'.mysql_error().'

'); 
        // 数据库编码方式 
        mysql_query ( 'SET NAMES ' . $this->charset, $this->db ); 
 
    } 
 
    /* 
     * 新增查询数据库表 
     */ 
    function getTables() { 
        $res = mysql_query ( "SHOW TABLES" ); 
        $tables = array (); 
        while ( $row = mysql_fetch_array ( $res ) ) { 
            $tables [] = $row [0]; 
        } 
        return $tables; 
    } 
 
    /* 
     * 
     * ------------------------------------------数据库备份start---------------------------------------------------------- 
     */ 
 
    /** 
     * 数据库备份 
     * 参数:备份哪个表(可选),备份目录(可选,默认为backup),分卷大小(可选,默认2000,即2M) 
     * 
     * @param $string $dir 
     * @param int $size 
     * @param $string $tablename 
     */ 
    function backup($tablename = '', $dir, $size) { 
        $dir = $dir ? $dir : './backup/'; 
        // 创建目录 
        if (! is_dir ( $dir )) { 
            mkdir ( $dir, 0777, true ) or die ( '创建文件夹失败' ); 
        } 
        $size = $size ? $size : 2048; 
        $sql = ''; 
        // 只备份某个表 
        if (! emptyempty ( $tablename )) { 
            if(@mysql_num_rows(mysql_query("SHOW TABLES LIKE '".$tablename."'")) == 1) { 
             } else { 
                $this->_showMsg('表-' . $tablename .'-不存在,请检查!',true); 
                die(); 
            } 
            $this->_showMsg('正在备份表 ' . $tablename.''); 
            // 插入dump信息 
            $sql = $this->_retrieve (); 
            // 插入表结构信息 
            $sql .= $this->_insert_table_structure ( $tablename ); 
            // 插入数据 
            $data = mysql_query ( "select * from " . $tablename ); 
            // 文件名前面部分 
            $filename = date ( 'YmdHis' ) . "_" . $tablename; 
            // 字段数量 
            $num_fields = mysql_num_fields ( $data ); 
            // 第几分卷 
            $p = 1; 
            // 循环每条记录 
            while ( $record = mysql_fetch_array ( $data ) ) { 
                // 单条记录 
                $sql .= $this->_insert_record ( $tablename, $num_fields, $record ); 
                // 如果大于分卷大小,则写入文件 
                if (strlen ( $sql ) >= $size * 1024) { 
                    $file = $filename . "_v" . $p . ".sql"; 
                    if ($this->_write_file ( $sql, $file, $dir )) { 
                        $this->_showMsg("表-" . $tablename . "-卷-" . $p . "-数据备份完成,备份文件 [ " .$dir . $file ." ]"); 
                    } else { 
                        $this->_showMsg("备份表 -" . $tablename . "- 失败",true); 
                        return false; 
                    } 
                    // 下一个分卷 
                    $p ++; 
                    // 重置$sql变量为空,重新计算该变量大小 
                    $sql = ""; 
                } 
            } 
            // 及时清除数据 
            unset($data,$record); 
            // sql大小不够分卷大小 
            if ($sql != "") { 
                $filename .= "_v" . $p . ".sql"; 
                if ($this->_write_file ( $sql, $filename, $dir )) { 
                    $this->_showMsg( "表-" . $tablename . "-卷-" . $p . "-数据备份完成,备份文件 [ " .$dir . $filename ." ]"); 
                } else { 
                    $this->_showMsg("备份卷-" . $p . "-失败
"); 
                    return false; 
                } 
            } 
            $this->_showMsg("恭喜您! 备份成功"); 
        } else { 
            $this->_showMsg('正在备份'); 
            // 备份全部表 
            if ($tables = mysql_query ( "show table status from " . $this->database )) { 
                $this->_showMsg("读取数据库结构成功!"); 
            } else { 
                $this->_showMsg("读取数据库结构失败!"); 
                exit ( 0 ); 
            } 
            // 插入dump信息 
            $sql .= $this->_retrieve (); 
            // 文件名前面部分 
            $filename = date ( 'YmdHis' ) . "_all"; 
            // 查出所有表 
            $tables = mysql_query ( 'SHOW TABLES' ); 
            // 第几分卷 
            $p = 1; 
            // 循环所有表 
            while ( $table = mysql_fetch_array ( $tables ) ) { 
                // 获取表名 
                $tablename = $table [0]; 
                // 获取表结构 
                $sql .= $this->_insert_table_structure ( $tablename ); 
                $data = mysql_query ( "select * from " . $tablename ); 
                $num_fields = mysql_num_fields ( $data ); 
 
                // 循环每条记录 
                while ( $record = mysql_fetch_array ( $data ) ) { 
                    // 单条记录 
                    $sql .= $this->_insert_record ( $tablename, $num_fields, $record ); 
                    // 如果大于分卷大小,则写入文件 
                    if (strlen ( $sql ) >= $size * 1000) { 
 
                        $file = $filename . "_v" . $p . ".sql"; 
                        // 写入文件 
                        if ($this->_write_file ( $sql, $file, $dir )) { 
                            $this->_showMsg("-卷-" . $p . "-数据备份完成,备份文件 [ ".$dir.$file." ]"); 
                        } else { 
                            $this->_showMsg("卷-" . $p . "-备份失败!",true); 
                            return false; 
                        } 
                        // 下一个分卷 
                        $p ++; 
                        // 重置$sql变量为空,重新计算该变量大小 
                        $sql = ""; 
                    } 
                } 
            } 
            // sql大小不够分卷大小 
            if ($sql != "") { 
                $filename .= "_v" . $p . ".sql"; 
                if ($this->_write_file ( $sql, $filename, $dir )) { 
                    $this->_showMsg("-卷-" . $p . "-数据备份完成,备份文件 [ ".$dir.$filename." ]"); 
                } else { 
                    $this->_showMsg("卷-" . $p . "-备份失败",true); 
                    return false; 
                } 
            } 
            $this->_showMsg("恭喜您! 备份成功"); 
        } 
    } 
 
    //  及时输出信息 
    private function _showMsg($msg,$err=false){ 
        $err = $err ? "ERROR:" : '' ; 
        echo "

".$err . $msg."

"; 
        flush(); 
 
    } 
 
    /** 
     * 插入数据库备份基础信息 
     * 
     * @return string 
     */ 
    private function _retrieve() { 
        $value = ''; 
        $value .= '--' . $this->ds; 
        $value .= '-- MySQL database dump' . $this->ds; 
        $value .= '-- Created by DbManage class, Power By yanue. ' . $this->ds; 
        $value .= '-- http://yanue.net ' . $this->ds; 
        $value .= '--' . $this->ds; 
        $value .= '-- 主机: ' . $this->host . $this->ds; 
        $value .= '-- 生成日期: ' . date ( 'Y' ) . ' 年  ' . date ( 'm' ) . ' 月 ' . date ( 'd' ) . ' 日 ' . date ( 'H:i' ) . $this->ds; 
        $value .= '-- MySQL版本: ' . mysql_get_server_info () . $this->ds; 
        $value .= '-- PHP 版本: ' . phpversion () . $this->ds; 
        $value .= $this->ds; 
        $value .= '--' . $this->ds; 
        $value .= '-- 数据库: `' . $this->database . '`' . $this->ds; 
        $value .= '--' . $this->ds . $this->ds; 
        $value .= '-- -------------------------------------------------------'; 
        $value .= $this->ds . $this->ds; 
        return $value; 
    } 
 
    /** 
     * 插入表结构 
     * 
     * @param unknown_type $table 
     * @return string 
     */ 
    private function _insert_table_structure($table) { 
        $sql = ''; 
        $sql .= "--" . $this->ds; 
        $sql .= "-- 表的结构" . $table . $this->ds; 
        $sql .= "--" . $this->ds . $this->ds; 
 
        // 如果存在则删除表 
        $sql .= "DROP TABLE IF EXISTS `" . $table . '`' . $this->sqlEnd . $this->ds; 
        // 获取详细表信息 
        $res = mysql_query ( 'SHOW CREATE TABLE `' . $table . '`' ); 
        $row = mysql_fetch_array ( $res ); 
        $sql .= $row [1]; 
        $sql .= $this->sqlEnd . $this->ds; 
        // 加上 
        $sql .= $this->ds; 
        $sql .= "--" . $this->ds; 
        $sql .= "-- 转存表中的数据 " . $table . $this->ds; 
        $sql .= "--" . $this->ds; 
        $sql .= $this->ds; 
        return $sql; 
    } 
 
    /** 
     * 插入单条记录 
     * 
     * @param string $table 
     * @param int $num_fields 
     * @param array $record 
     * @return string 
     */ 
    private function _insert_record($table, $num_fields, $record) { 
        // sql字段逗号分割 
        $insert = ''; 
        $comma = ""; 
        $insert .= "INSERT INTO `" . $table . "` VALUES("; 
        // 循环每个子段下面的内容 
        for($i = 0; $i              $insert .= ($comma . "'" . mysql_escape_string ( $record [$i] ) . "'"); 
            $comma = ","; 
        } 
        $insert .= ");" . $this->ds; 
        return $insert; 
    } 
 
    /** 
     * 写入文件 
     * 
     * @param string $sql 
     * @param string $filename 
     * @param string $dir 
     * @return boolean 
     */ 
    private function _write_file($sql, $filename, $dir) { 
        $dir = $dir ? $dir : './backup/'; 
        // 创建目录 
        if (! is_dir ( $dir )) { 
            mkdir ( $dir, 0777, true ); 
        } 
        $re = true; 
        if (! @$fp = fopen ( $dir . $filename, "w+" )) { 
            $re = false; 
            $this->_showMsg("打开sql文件失败!",true); 
        } 
        if (! @fwrite ( $fp, $sql )) { 
            $re = false; 
            $this->_showMsg("写入sql文件失败,请文件是否可写",true); 
        } 
        if (! @fclose ( $fp )) { 
            $re = false; 
            $this->_showMsg("关闭sql文件失败!",true); 
        } 
        return $re; 
    } 
 
    /* 
     * 
     * -------------------------------上:数据库导出-----------分割线----------下:数据库导入-------------------------------- 
     */ 
 
    /** 
     * 导入备份数据 
     * 说明:分卷文件格式20120516211738_all_v1.sql 
     * 参数:文件路径(必填) 
     * 
     * @param string $sqlfile 
     */ 
    function restore($sqlfile) { 
        // 检测文件是否存在 
        if (! file_exists ( $sqlfile )) { 
            $this->_showMsg("sql文件不存在!请检查",true); 
            exit (); 
        } 
        $this->lock ( $this->database ); 
        // 获取数据库存储位置 
        $sqlpath = pathinfo ( $sqlfile ); 
        $this->sqldir = $sqlpath ['dirname']; 
        // 检测是否包含分卷,将类似20120516211738_all_v1.sql从_v分开,有则说明有分卷 
        $volume = explode ( "_v", $sqlfile ); 
        $volume_path = $volume [0]; 
        $this->_showMsg("请勿刷新及关闭浏览器以防止程序被中止,如有不慎!将导致数据库结构受损"); 
        $this->_showMsg("正在导入备份数据,请稍等!"); 
        if (emptyempty ( $volume [1] )) { 
            $this->_showMsg ( "正在导入sql:" . $sqlfile . ''); 
            // 没有分卷 
            if ($this->_import ( $sqlfile )) { 
                $this->_showMsg( "数据库导入成功!"); 
            } else { 
                 $this->_showMsg('数据库导入失败!',true); 
                exit (); 
            } 
        } else { 
            // 存在分卷,则获取当前是第几分卷,循环执行余下分卷 
            $volume_id = explode ( ".sq", $volume [1] ); 
            // 当前分卷为$volume_id 
            $volume_id = intval ( $volume_id [0] ); 
            while ( $volume_id ) { 
                $tmpfile = $volume_path . "_v" . $volume_id . ".sql"; 
                // 存在其他分卷,继续执行 
                if (file_exists ( $tmpfile )) { 
                    // 执行导入方法 
                    $this->msg .= "正在导入分卷 $volume_id :" . $tmpfile . '
'; 
                    if ($this->_import ( $tmpfile )) { 
 
                    } else { 
                        $volume_id = $volume_id ? $volume_id :1; 
                        exit ( "导入分卷:" . $tmpfile . '失败!可能是数据库结构已损坏!请尝试从分卷1开始导入' ); 
                    } 
                } else { 
                    $this->msg .= "此分卷备份全部导入成功!
"; 
                    return; 
                } 
                $volume_id ++; 
            } 
        }if (emptyempty ( $volume [1] )) { 
            $this->_showMsg ( "正在导入sql:" . $sqlfile . ''); 
            // 没有分卷 
            if ($this->_import ( $sqlfile )) { 
                $this->_showMsg( "数据库导入成功!"); 
            } else { 
                 $this->_showMsg('数据库导入失败!',true); 
                exit (); 
            } 
        } else { 
            // 存在分卷,则获取当前是第几分卷,循环执行余下分卷 
            $volume_id = explode ( ".sq", $volume [1] ); 
            // 当前分卷为$volume_id 
            $volume_id = intval ( $volume_id [0] ); 
            while ( $volume_id ) { 
                $tmpfile = $volume_path . "_v" . $volume_id . ".sql"; 
                // 存在其他分卷,继续执行 
                if (file_exists ( $tmpfile )) { 
                    // 执行导入方法 
                    $this->msg .= "正在导入分卷 $volume_id :" . $tmpfile . '
'; 
                    if ($this->_import ( $tmpfile )) { 
 
                    } else { 
                        $volume_id = $volume_id ? $volume_id :1; 
                        exit ( "导入分卷:" . $tmpfile . '失败!可能是数据库结构已损坏!请尝试从分卷1开始导入' ); 
                    } 
                } else { 
                    $this->msg .= "此分卷备份全部导入成功!
"; 
                    return; 
                } 
                $volume_id ++; 
            } 
        } 
    } 
 
    /** 
     * 将sql导入到数据库(普通导入) 
     * 
     * @param string $sqlfile 
     * @return boolean 
     */ 
    private function _import($sqlfile) { 
        // sql文件包含的sql语句数组 
        $sqls = array (); 
        $f = fopen ( $sqlfile, "rb" ); 
        // 创建表缓冲变量 
        $create_table = ''; 
        while ( ! feof ( $f ) ) { 
            // 读取每一行sql 
            $line = fgets ( $f ); 
            // 这一步为了将创建表合成完整的sql语句 
            // 
PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
AO3官网入口与中文阅读设置 AO3网页版使用与访问
AO3官网入口与中文阅读设置 AO3网页版使用与访问

本专题围绕 Archive of Our Own(AO3)官网入口展开,系统整理 AO3 最新可用官网地址、网页版访问方式、正确打开链接的方法,并详细讲解 AO3 中文界面设置、阅读语言切换及基础使用流程,帮助用户稳定访问 AO3 官网,高效完成中文阅读与作品浏览。

3

2026.02.02

主流快递单号查询入口 实时物流进度一站式追踪专题
主流快递单号查询入口 实时物流进度一站式追踪专题

本专题聚合极兔快递、京东快递、中通快递、圆通快递、韵达快递等主流物流平台的单号查询与运单追踪内容,重点解决单号查询、手机号查物流、官网入口直达、包裹进度实时追踪等高频问题,帮助用户快速获取最新物流状态,提升查件效率与使用体验。

0

2026.02.02

Golang WebAssembly(WASM)开发入门
Golang WebAssembly(WASM)开发入门

本专题系统讲解 Golang 在 WebAssembly(WASM)开发中的实践方法,涵盖 WASM 基础原理、Go 编译到 WASM 的流程、与 JavaScript 的交互方式、性能与体积优化,以及典型应用场景(如前端计算、跨平台模块)。帮助开发者掌握 Go 在新一代 Web 技术栈中的应用能力。

1

2026.02.02

PHP Swoole 高性能服务开发
PHP Swoole 高性能服务开发

本专题聚焦 PHP Swoole 扩展在高性能服务端开发中的应用,系统讲解协程模型、异步IO、TCP/HTTP/WebSocket服务器、进程与任务管理、常驻内存架构设计。通过实战案例,帮助开发者掌握 使用 PHP 构建高并发、低延迟服务端应用的工程化能力。

1

2026.02.02

Java JNI 与本地代码交互实战
Java JNI 与本地代码交互实战

本专题系统讲解 Java 通过 JNI 调用 C/C++ 本地代码的核心机制,涵盖 JNI 基本原理、数据类型映射、内存管理、异常处理、性能优化策略以及典型应用场景(如高性能计算、底层库封装)。通过实战示例,帮助开发者掌握 Java 与本地代码混合开发的完整流程。

1

2026.02.02

go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

61

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

52

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

25

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

10

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP零基础通关宝典
PHP零基础通关宝典

共78课时 | 9.6万人学习

Pandas 教程
Pandas 教程

共15课时 | 1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号