Windows忘记mysql root密码解决方法

Windowslinyu520 发表了文章 • 55 个评论 • 591 次浏览 • 2016-11-20 17:41 • 来自相关话题

  mysql忘记了root密码,只能让mysql服务运行在“--skip-grant-tables”(跳过权限安全检查)模式,在此模式下,在本机不需要密码就能使用root用户登录到mysql的sql命令行,这样就能使用SQL语句修改root密码了。
 
一、进入“--skip-grant-tables”模式:
  要使mysql服务进入“跳过权限安全检查”模式运行,有两种方法:一是在mysql的安装目录下的“my.ini”配置文件里的“[mysqld]”下面添加“skip-grant-tables”,然后重启mysql服务;二是在启动mysqld服务命令行上面添加“--skip-grant-tables”参数。下面分别详细介绍两种方式:
 
方法一:
  在mysql的安装目录下找到“my.ini”(如果没有,可将“my-default.ini”或者“my-small.ini”复制一份改成“my.ini”),修改“my.ini”,在文件最上面的“[mysqld]”选项组下添加“skip-grant-tables”,如下:[mysqld]
skip-grant-tables
#...省略N行..爱E族:aiezu.com...保存文件,在cmd命令行下运行下面命令重启mysql服务,即mysql服务进入了“skip-grant-tables”模式。net stop mysql
net start mysql
 方法二:
1、首先检查mysql服务是否启动,如果已启动则先将其停止服务,可在cmd命令行下运行下面命令停止服务:net stop mysql停止后,cmd进入到mysql安装目录下的bin目录,运行带“--skip-grant-tables”参数的mysql服务启动命令,临时将mysql服务运行在“跳过权限安全检查”模式:cd C:\Program Files\MySQL\MySQL Server 5.3.2.4\bin\
mysqld --defaults-file="C:\Program Files\MySQL\MySQL Server 5.3.2.4\my.ini" --console --skip-grant-tables
二、重置mysql root密码:
新打开一个cmd命令行,输入下面命令,进入到Mysql的SQL语句执行命令行:cd C:\Program Files\MySQL\MySQL Server 5.3.2.4\bin\
mysql -uroot在这里直接回车,不用输入密码。然后就就会出现登录成功的信息。

然后运行下面SQL语句,重置mysql root用户的密码,这里想新密码设置为“aiezu.com”:use mysql;
UPDATE user SET Password=PASSWORD('aiezu.com') where USER='root';
FLUSH PRIVILEGES;
quit
 三、恢复mysql服务到正常模式:
  根据第一步使用的方法不同,去掉“skip-grant-tables”选项,并重启mysql服务,将mysql服务恢复到正常模式运行。
 
四、mysql root密码重置完成:
重新登录,出现输入密码提示,输入新的密码即可登录:mysql -uroot -p
Enter password: ***********密码重置完成!!
 
本文介绍的是Windows忘记mysql root密码解决方法,如果是Linux忘记了root密码,可以参考:Linux忘记mysql root密码解决方法 查看全部
  mysql忘记了root密码,只能让mysql服务运行在“--skip-grant-tables”(跳过权限安全检查)模式,在此模式下,在本机不需要密码就能使用root用户登录到mysql的sql命令行,这样就能使用SQL语句修改root密码了。
 
一、进入“--skip-grant-tables”模式:
  要使mysql服务进入“跳过权限安全检查”模式运行,有两种方法:一是在mysql的安装目录下的“my.ini”配置文件里的“[mysqld]”下面添加“skip-grant-tables”,然后重启mysql服务;二是在启动mysqld服务命令行上面添加“--skip-grant-tables”参数。下面分别详细介绍两种方式:
 
方法一:
  在mysql的安装目录下找到“my.ini”(如果没有,可将“my-default.ini”或者“my-small.ini”复制一份改成“my.ini”),修改“my.ini”,在文件最上面的“[mysqld]”选项组下添加“skip-grant-tables”,如下:
[mysqld]
skip-grant-tables
#...省略N行..爱E族:aiezu.com...
保存文件,在cmd命令行下运行下面命令重启mysql服务,即mysql服务进入了“skip-grant-tables”模式。
net stop mysql
net start mysql

 方法二:
1、首先检查mysql服务是否启动,如果已启动则先将其停止服务,可在cmd命令行下运行下面命令停止服务:
net stop mysql
停止后,cmd进入到mysql安装目录下的bin目录,运行带“--skip-grant-tables”参数的mysql服务启动命令,临时将mysql服务运行在“跳过权限安全检查”模式:
cd C:\Program Files\MySQL\MySQL Server 5.3.2.4\bin\
mysqld --defaults-file="C:\Program Files\MySQL\MySQL Server 5.3.2.4\my.ini" --console --skip-grant-tables

二、重置mysql root密码:
新打开一个cmd命令行,输入下面命令,进入到Mysql的SQL语句执行命令行:
cd C:\Program Files\MySQL\MySQL Server 5.3.2.4\bin\
mysql -uroot
在这里直接回车,不用输入密码。然后就就会出现登录成功的信息。

然后运行下面SQL语句,重置mysql root用户的密码,这里想新密码设置为“aiezu.com”:
use mysql;
UPDATE user SET Password=PASSWORD('aiezu.com') where USER='root';
FLUSH PRIVILEGES;
quit

 三、恢复mysql服务到正常模式:
  根据第一步使用的方法不同,去掉“skip-grant-tables”选项,并重启mysql服务,将mysql服务恢复到正常模式运行。
 
四、mysql root密码重置完成:
重新登录,出现输入密码提示,输入新的密码即可登录:
mysql -uroot -p
Enter password: ***********
密码重置完成!!
 
本文介绍的是Windows忘记mysql root密码解决方法,如果是Linux忘记了root密码,可以参考:Linux忘记mysql root密码解决方法

Linux忘记mysql root密码解决方法

Mysqllinyu520 发表了文章 • 0 个评论 • 555 次浏览 • 2016-11-20 15:52 • 来自相关话题

一、使用跳过权限检查的方式运行MySQL服务:
  要使用跳过权限检查的方式运行MySQL服务,有两种方式:1、在mysql服务的配置文件中添加“skip-grant-tables”选项;2、在启动mysql服务的命令后添加“--skip-grant-tables”选项。下面分别讲述两种方法:
 
方法一:修改配置文件的方式:
  修改mysql服务的配置文件“/etc/my.cnf”(根据你的安装方式不同,路径也可能不同),在“[mysqld]”配置组下添加一行“skip-grant-tables”后保存:[mysqld]
...爱E族..aiezu.com..省略N行...
skip-grant-tables保存后,重启“mysqld”服务,这时登录mysql就不再需要密码了。
 
方法二:在启动命令的后添加选项的方式:
  在linux终端运行下面命令,停止并重新以“跳过权限检查”的方式运行mysql服务,登录mysql即可不在需要密码:/etc/init.d/mysql stop
/etc/init.d/mysql start --mysqld --skip-grant-tables
二、设置新密码:
  按上步操作后,在终端运行“mysql -u root”命令,免密码进入mysql的sql命令行,并执行下面SQL语句设置新密码:
use mysql;
--将root密码设置为“aiezu.com”
update user set password=PASSWORD("aiezu.com") where user='root';
flush privileges  注意:在“skip-grant-tables”模式下,不要尝试使用“mysqladmin password”命令修改密码,否则将会报如下错误:[root@aiezu.com ~]# mysqladmin password
New password:
Confirm new password:
mysqladmin:
You cannot use 'password' command as mysqld runs
with grant tables disabled (was started with --skip-grant-tables).
Use: "mysqladmin flush-privileges password '*'" instead 
三、恢复正常启动方式:
  根据第一步的操作不同,选择下面两种方式之一将mysqld服务由“跳过权限检查”模式转换为正常模式,这样就可以使用新设置的密码登录了: 在“my.cnf”配置文件中去掉“skip-grant-tables”,并重启“mysqld”服务;停止mysqld服务,并再启动mysqld服务(去掉“--skip-grant-tables”选项) 
 
[size=14]  本文介绍的是Linux忘记mysql root密码解决方法,如果是Windows忘记了root密码,可以参考:[/size]Windows忘记mysql root密码解决方法 查看全部
一、使用跳过权限检查的方式运行MySQL服务:
  要使用跳过权限检查的方式运行MySQL服务,有两种方式:1、在mysql服务的配置文件中添加“skip-grant-tables”选项;2、在启动mysql服务的命令后添加“--skip-grant-tables”选项。下面分别讲述两种方法:
 
方法一:修改配置文件的方式:
  修改mysql服务的配置文件“/etc/my.cnf”(根据你的安装方式不同,路径也可能不同),在“[mysqld]”配置组下添加一行“skip-grant-tables”后保存:
[mysqld]
...爱E族..aiezu.com..省略N行...
skip-grant-tables
保存后,重启“mysqld”服务,这时登录mysql就不再需要密码了。
 
方法二:在启动命令的后添加选项的方式:
  在linux终端运行下面命令,停止并重新以“跳过权限检查”的方式运行mysql服务,登录mysql即可不在需要密码:
/etc/init.d/mysql stop
/etc/init.d/mysql start --mysqld --skip-grant-tables

二、设置新密码:
  按上步操作后,在终端运行“mysql -u root”命令,免密码进入mysql的sql命令行,并执行下面SQL语句设置新密码:
use mysql;
--将root密码设置为“aiezu.com”
update user set password=PASSWORD("aiezu.com") where user='root';
flush privileges
  注意:在“skip-grant-tables”模式下,不要尝试使用“mysqladmin password”命令修改密码,否则将会报如下错误:
[root@aiezu.com ~]# mysqladmin password
New password:
Confirm new password:
mysqladmin:
You cannot use 'password' command as mysqld runs
with grant tables disabled (was started with --skip-grant-tables).
Use: "mysqladmin flush-privileges password '*'" instead
 
三、恢复正常启动方式:
  根据第一步的操作不同,选择下面两种方式之一将mysqld服务由“跳过权限检查”模式转换为正常模式,这样就可以使用新设置的密码登录了: 
  • 在“my.cnf”配置文件中去掉“skip-grant-tables”,并重启“mysqld”服务;
  • 停止mysqld服务,并再启动mysqld服务(去掉“--skip-grant-tables”选项)
 
 
[size=14]  本文介绍的是Linux忘记mysql root密码解决方法,如果是Windows忘记了root密码,可以参考:[/size]Windows忘记mysql root密码解决方法

MySQL修改root密码

回复

Mysql匿名用户 回复了问题 • 1 人关注 • 1 个回复 • 323 次浏览 • 2016-11-20 20:37 • 来自相关话题

mysql错误ERROR 1064 (42000)

回复

Mysqllinyu520 回复了问题 • 1 人关注 • 1 个回复 • 486 次浏览 • 2016-11-18 12:41 • 来自相关话题

让Mysql支持事务处理(修改数据库的存储引擎类型)

Mysqllinyu520 发表了文章 • 0 个评论 • 442 次浏览 • 2016-11-18 10:39 • 来自相关话题

  有时我们发现我们的Mysql数据库使用事务时无效,这很有可能是数据库使用的存储引擎(storage engine)不支持事务处理。比如创建数据库时的默认存储引擎“MyISAM”,它是性能优先的存储引擎,不支持事务处理。这时我们可以按下面步骤处理,解决MySQL不支持事务的问题。
 
一、查看数据库的存储引擎:
1、查看MySQL系统当前使用的存储引擎:
  使用SQL“show variables like '%storage_engine%';”命令,可以查看MySQL系统当前使用的存储引擎:MariaDB [aiezu]> show variables like '%storage_engine%';
+------------------------+--------+
| Variable_name | Value |
+------------------------+--------+
| default_storage_engine | MyISAM |
| storage_engine | MyISAM |
+------------------------+--------+
2 rows in set (0.01 sec) 
2、查看指定数据库所有表使用的存储引擎:
  使用“show table status from aiezu;”命令,可以查看指定数据库所有表使用的存储引擎,其中“aiezu”为数据库名。

3、查看指定表的存储引擎:MariaDB [aiezu]> show create table test;
+-------+---------------------------------------------------------+
| Table | Create Table |
+-------+---------------------------------------------------------+
| test | CREATE TABLE `test` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(36) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
+-------+----------------------------------------------------------+
1 row in set (0.00 sec) 
二、查看当前数据库系统支持的引擎:
  使用show engines;命令可以查看当前数据库支持的引擎:


可以看出,笔者用的MariaDB-5.5.47,支持10种存储引擎,而这10种存储引擎中,只有“InnoDB”、“FEDERATED” 这两种存储引擎支持事务处理。
 
三、修改数据库存储引擎:
1、修改整个系统创建数据表时的默认存储引擎:
  要让以后新建的数据表,默认使用支持事务处理的“InnoDB”做为默认存储引擎,修改“/etc/my.conf”文件,在“[mysqld]”下添加一行“default-storage-engine=InnoDB”,然后重启数据库即可:[mysqld]
...省略N行,爱E族 aiezu.com ...
default-storage-engine=InnoDB 
2、修改已有数据表的存储引擎:
  要将已有的数据表,修改为使用“InnoDB”作为默认存储引擎,通过“alter table”命令:
低版本:mysql> alter table test type=INNODB;
Query OK, 0 rows affected, 1 warning (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0高版本:MariaDB [aiezu]> alter table test ENGINE=INNODB;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0 
四、测试MySQL事务处理:
  MySQL使用BEGIN(或START TRANSACTION)、COMMIT、ROLLBACK三命令分别代表开始一个事务、提交事务、回滚事务,事务简单的流程如下:--回滚的事务
BEGIN;
-- 事务要执行的操作,update、delete等..
ROLLBACK;

--提交的事务
BEGIN;
-- 事务要执行的操作,update、delete等..
COMMIT;
 事务的简单例子:MariaDB [aiezu]> truncate table test;
Query OK, 0 rows affected (0.00 sec)

MariaDB [aiezu]> BEGIN;
Query OK, 0 rows affected (0.00 sec)

MariaDB [aiezu]> insert test(name,url) values('天猫','tmall.com');
Query OK, 1 row affected (0.00 sec)

MariaDB [aiezu]> ROLLBACK;
Query OK, 0 rows affected (0.00 sec)

MariaDB [aiezu]> insert test(name,url) values('爱E族','aiezu.com');
Query OK, 1 row affected (0.01 sec)

MariaDB [aiezu]> select * from test;
+----+---------+-----------+
| id | name | url |
+----+---------+-----------+
| 2 | 爱E族 | aiezu.com |
+----+---------+-----------+
1 row in set (0.00 sec)  上面可以看出,插入的站点“天猫”,由于在事务里,事务被回滚,所以插入被撤销。但是它的“id:1”已经被其占用,所以后面成功插入的站点“爱E族”使用的ID是“2”。
 
五、常见错误:
错误一:ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'type=innodb' at line 1解决方法:
  这个错误是当前MySQL版本不支持type方式设置存储引擎的,将type关键词改成ENGINE 即可。alter table test type=INNODB; --低版本
alter table test ENGINE=INNODB; --高版本 查看全部
  有时我们发现我们的Mysql数据库使用事务时无效,这很有可能是数据库使用的存储引擎(storage engine)不支持事务处理。比如创建数据库时的默认存储引擎“MyISAM”,它是性能优先的存储引擎,不支持事务处理。这时我们可以按下面步骤处理,解决MySQL不支持事务的问题。
 
一、查看数据库的存储引擎:
1、查看MySQL系统当前使用的存储引擎:
  使用SQL“show variables like '%storage_engine%';”命令,可以查看MySQL系统当前使用的存储引擎:
MariaDB [aiezu]> show variables like '%storage_engine%';
+------------------------+--------+
| Variable_name | Value |
+------------------------+--------+
| default_storage_engine | MyISAM |
| storage_engine | MyISAM |
+------------------------+--------+
2 rows in set (0.01 sec)
 
2、查看指定数据库所有表使用的存储引擎:
  使用“show table status from aiezu;”命令,可以查看指定数据库所有表使用的存储引擎,其中“aiezu”为数据库名。

3、查看指定表的存储引擎:
MariaDB [aiezu]> show create table test;
+-------+---------------------------------------------------------+
| Table | Create Table |
+-------+---------------------------------------------------------+
| test | CREATE TABLE `test` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(36) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
+-------+----------------------------------------------------------+
1 row in set (0.00 sec)
 
二、查看当前数据库系统支持的引擎:
  使用show engines;命令可以查看当前数据库支持的引擎:
QQ图片20161118104554.png
可以看出,笔者用的MariaDB-5.5.47,支持10种存储引擎,而这10种存储引擎中,只有“InnoDB”、“FEDERATED” 这两种存储引擎支持事务处理。
 
三、修改数据库存储引擎:
1、修改整个系统创建数据表时的默认存储引擎:
  要让以后新建的数据表,默认使用支持事务处理的“InnoDB”做为默认存储引擎,修改“/etc/my.conf”文件,在“[mysqld]”下添加一行“default-storage-engine=InnoDB”,然后重启数据库即可:
[mysqld]
...省略N行,爱E族 aiezu.com ...
default-storage-engine=InnoDB
 
2、修改已有数据表的存储引擎:
  要将已有的数据表,修改为使用“InnoDB”作为默认存储引擎,通过“alter table”命令:
低版本:
mysql> alter table test type=INNODB;
Query OK, 0 rows affected, 1 warning (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
高版本:
MariaDB [aiezu]> alter table test ENGINE=INNODB;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
 
四、测试MySQL事务处理:
  MySQL使用BEGIN(或START TRANSACTION)、COMMIT、ROLLBACK三命令分别代表开始一个事务、提交事务、回滚事务,事务简单的流程如下:
--回滚的事务
BEGIN;
-- 事务要执行的操作,update、delete等..
ROLLBACK;

--提交的事务
BEGIN;
-- 事务要执行的操作,update、delete等..
COMMIT;

 事务的简单例子:
MariaDB [aiezu]> truncate table test;
Query OK, 0 rows affected (0.00 sec)

MariaDB [aiezu]> BEGIN;
Query OK, 0 rows affected (0.00 sec)

MariaDB [aiezu]> insert test(name,url) values('天猫','tmall.com');
Query OK, 1 row affected (0.00 sec)

MariaDB [aiezu]> ROLLBACK;
Query OK, 0 rows affected (0.00 sec)

MariaDB [aiezu]> insert test(name,url) values('爱E族','aiezu.com');
Query OK, 1 row affected (0.01 sec)

MariaDB [aiezu]> select * from test;
+----+---------+-----------+
| id | name | url |
+----+---------+-----------+
| 2 | 爱E族 | aiezu.com |
+----+---------+-----------+
1 row in set (0.00 sec)
  上面可以看出,插入的站点“天猫”,由于在事务里,事务被回滚,所以插入被撤销。但是它的“id:1”已经被其占用,所以后面成功插入的站点“爱E族”使用的ID是“2”。
 
五、常见错误:
错误一:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'type=innodb' at line 1
解决方法:
  这个错误是当前MySQL版本不支持type方式设置存储引擎的,将type关键词改成ENGINE 即可。
alter table test type=INNODB; --低版本
alter table test ENGINE=INNODB; --高版本

CentOS使用Yum为PHP安装Xdebug调试神器

PHPlinyu520 发表了文章 • 0 个评论 • 741 次浏览 • 2016-11-17 22:10 • 来自相关话题

一、实验环境:操作系统:CentOS Linux release 7.2.1511 (Core)PHP版本:PHP 5.4.16 (cli) ,Yum方式安装Xdebug版本:2.2.7-1.el7 
  
二、安装前准备:
  不管是Lamp环境还是Lnmp环境,这里不讲述安装过程,这里只讲述Xdebug的安装。虽然使用yum方式安装Xdebug比较简单,但是还是建议在实验环境测试,安装前最好备份数据。
 
三、安装:
1、使用yum安装xdebug:[root@aiezu.com ~]# yum list|grep xdebug
php-pecl-xdebug.x86_64 2.2.7-1.el7 @epel
[root@aiezu.com ~]# yum install php-pecl-xdebug安装完成后,会生成“/etc/php.d/xdebug.ini”配置文件,配置文件中已经设置好xdebug的so文件,我们在这配置文件中设置xdebug设置参数。
 
四、配置Xdebug:
1、创建日志目录:
  我们创建/tmp/xdebug做为日志存储目录:[root@aiezu.com ~]# mkdir -p /tmp/xdebug
[root@aiezu.com ~]# chmod -R 777 /tmp/xdebug 
2、配置xdebug参数:
  修改“/etc/php.d/xdebug.ini”文件,根据你的需求配置参数,详细参数见附件中的《Xdebug详细参数表》。; Enable xdebug extension module
zend_extension=/usr/lib64/php/modules/xdebug.so

;启用代码自动跟踪
xdebug.auto_trace = On
;指定堆栈跟踪文件的存放目录
xdebug.trace_output_dir = /tmp/xdebug
;PHP代码跟踪日志文件名格式
xdebug.trace_output_name = trace.%c.%H
;启用性能检测分析
xdebug.profiler_enable=On
;允许收集传递给函数的参数变量
xdebug.collect_params= 4
;允许收集函数调用的返回值
xdebug.collect_return=On
;是否收集include、require的文件
xdebug.collect_includes = On
;是否收集内存的增加还是减少
;xdebug.show_mem_delta = On
;是否打印函数调用的最外围中的所有局部变量
;xdebug.show_local_vars = On
xdebug.profiler_enable = Off
;xdebug.profiler_output_dir = /tmp/xdebug
;xdebug.profiler_output_name = cachegrind.out.%H注:设置“xdebug.auto_trace = On”时,将会在执行所有PHP脚本之前先自动启用跟踪;另外,你也可以设置为“xdebug.auto_trace = 0”,并在PHP脚本开头和结尾分别调用xdebug_start_trace()和 xdebug_stop_trace()函数开启和结束跟踪。如:<?php
xdebug_start_trace();
//要追踪的代码
xdebug_stop_trace(); 
五、查看追踪日志:
  设置好配置文件后,并重启httpd服务,如果开启自动追踪,或者在脚本中使用xdebug_start_trace()和xdebug_stop_trace()函数开启追踪,那么在“/tmp/xdebug”命令下就可以看到追踪日志了。你可以使用vim查看他们,找出脚本中的问题。

附件:Xdebug详细参数表:选项名类型默认值参数选项描述xdebug.auto_tracebooleanOff是否在脚本运行之前自动调用相关追踪函数。xdebug.cli_colorinteger0如果值=1:
  当处于CLI模式或连接虚拟控制台时,Xdebug将高亮显示var_dumps()和堆栈输出;在Windows中,这需要安装ANSICON工具。
如果值=2:
  不管是否处于CLI模式或连接虚拟控制台,Xdebug都会高亮显示var_dumps()或堆栈输出;这种情况下,你可能会看到转义后的代码。
该参数自2.2版本开始引入。xdebug.collect_assignmentsbooleanOff用于控制是否为函数跟踪添加变量赋值功能。
该参数自2.1版本开始引入。xdebug.collect_includesbooleanOn控制是否在跟踪文件中写入include()、include_once()、require()、require_once()等函数中用到的文件名。xdebug.collect_paramsinteger0控制在调用函数时,是否收集传递给函数的参数信息。
  如果值=0,则不显示任何信息。
  如果值=1,只显示类型和大小信息,例如:string(6)、array(8)。
  如果值=2,将显示类型和大小,以及全部信息的工具提示。
  如果值=3,将显示变量的全部内容。
  如果值=4,将显示变量的全部内容和变量名。
如果参数值过大,这可能会占用大量的内存;不过,在Xdebug 2中不会出现该问题,因为Xdebug 2将相关数据写入磁盘中,而不是占用内存。xdebug.collect_returnbooleanOff控制是否在追踪文件中写入函数调用的返回值。xdebug.collect_varsbooleanOff控制是否收集指定作用域中的变量信息。由于需要反向工程PHP的操作码数组,因此Xdebug的分析速度可能比较慢。xdebug.coverage_enablebooleanOn控制是否允许通过设置内部结构来启用代码覆盖率功能。
该参数自2.2版本开始引入。xdebug.default_enablebooleanOn当发生异常或错误时,是否默认显示堆栈信息。xdebug.dump.*stringEmpty这里的*可以是COOKIE, FILES, GET, POST, REQUEST, SERVER, SESSION中的任意一个。用于指定发生错误时是否显示超全局变量数组中的索引变量信息。比如,你想要显示请求的IP地址和请求方式,可以设置为xdebug.dump.SERVER=REMOTE_ADD,REQUEST_METHOD多个索引变量用英文逗号隔开,如果要输出其中的所有变量,可以直接用*,例如:xdebug.dump.GET=*xdebug.dump_globalsbooleanOn控制是否显示通过xdebug.dump.*定义的所有超全局变量的信息。xdebug.dump_oncebooleanOn如果出现多个错误,控制超全局变量信息是在所有错误中显示,还是只在第一个错误中显示。xdebug.dump_undefinedbooleanOn控制是否显示超全局变量中未定义的值。xdebug.extended_infointeger1是否强制进入PHP解析器的"extended_info"模式,这将允许Xdebug以远程调试器对文件或行添加断点。开启此模式将拖慢脚本的允许速度,该参数只能在php.ini中设置。xdebug.file_link_formatstring,用于指定堆栈信息中用到的文件名称的链接样式,这允许IDE通过设置链接协议,直接点击堆栈信息中的文件名称,即可快速打开指定的文件。
例如:ZendStudio://%f@%l(%f表示文件路径,%f表示行号)。
自2.2版本开始引入。xdebug.force_display_errorsinteger0是否强制显示错误信息。
自2.3版本开始引入。xdebug.force_error_reportinginteger0是否强制显示所有错误级别的信息。
自2.3版本开始引入。xdebug.halt_levelinteger0指定出现那些错误级别的错误时,中止程序运行。例如:xdebug.halt_level=E_WARNING|E_NOTICE|E_USER_WARNING|E_USER_NOTICE(也仅支持上述4种错误级别)。
自2.3版本开始引入。xdebug.idekeystring*complex*指定传递给DBGp调试器处理程序的IDE Key。xdebug.manual_urlstringhttp://www.php.net用于指定从函数堆栈和错误信息链接到的帮助手册的基本URL。
仅2.2.1以下版本可用。xdebug.max_nesting_levelinteger100指定递归的嵌套层级数。xdebug.overload_var_dumpbooleanOn当php.ini中的html_error设为1时,Xdebug是否默认使用自身的改进版本来重载var_dump()。
自2.2版本开始引入。xdebug.profiler_appendinteger0当多个请求映射到相同文件时,指定是覆盖之前的调试信息文件还是追加内容到该文件中。xdebug.profiler_enableinteger0指定是否启用Xdebug的性能分析,并创建性能信息文件。xdebug.profiler_output_dirstring/tmp指定性能分析信息文件的输出目录xdebug.profiler_output_namestringcachegrind.out.%p

 指定性能分析信息文件的名称xdebug.remote_enablebooleanOff是否开启远程调试xdebug.remote_handlerstringdbgp指定远程调试的处理协议xdebug.remote_hoststringlocalhost指定远程调试的主机名xdebug.remote_logstring 指定远程调试的日志文件名xdebug.remote_modestringreq可以设为req或jit,req表示脚本一开始运行就连接远程客户端,jit表示脚本出错时才连接远程客户端。xdebug.remote_portinteger9000指定远程调试的端口号xdebug.trace_optionsinteger0指定对于之后的请求,追踪文件是追加内容还是覆盖之前内容。xdebug.trace_output_dirstring/tmp指定追踪文件的存放目录xdebug.trace_output_namestringtrace.%c指定追踪文件的名称xdebug.show_exception_tracebooleanOff是否开启异常跟踪xdebug.show_mem_deltabooleanOff是否追踪内存的变化xdebug.show_local_varsbooleanOff是否显示局部变量  查看全部
一、实验环境:
  • 操作系统:CentOS Linux release 7.2.1511 (Core)
  • PHP版本:PHP 5.4.16 (cli) ,Yum方式安装
  • Xdebug版本:2.2.7-1.el7 

  
二、安装前准备:
  不管是Lamp环境还是Lnmp环境,这里不讲述安装过程,这里只讲述Xdebug的安装。虽然使用yum方式安装Xdebug比较简单,但是还是建议在实验环境测试,安装前最好备份数据。
 
三、安装:
1、使用yum安装xdebug:
[root@aiezu.com ~]# yum list|grep xdebug
php-pecl-xdebug.x86_64 2.2.7-1.el7 @epel
[root@aiezu.com ~]# yum install php-pecl-xdebug
安装完成后,会生成“/etc/php.d/xdebug.ini”配置文件,配置文件中已经设置好xdebug的so文件,我们在这配置文件中设置xdebug设置参数。
 
四、配置Xdebug:
1、创建日志目录:
  我们创建/tmp/xdebug做为日志存储目录:
[root@aiezu.com ~]# mkdir -p /tmp/xdebug
[root@aiezu.com ~]# chmod -R 777 /tmp/xdebug
 
2、配置xdebug参数:
  修改“/etc/php.d/xdebug.ini”文件,根据你的需求配置参数,详细参数见附件中的《Xdebug详细参数表》。
; Enable xdebug extension module
zend_extension=/usr/lib64/php/modules/xdebug.so

;启用代码自动跟踪
xdebug.auto_trace = On
;指定堆栈跟踪文件的存放目录
xdebug.trace_output_dir = /tmp/xdebug
;PHP代码跟踪日志文件名格式
xdebug.trace_output_name = trace.%c.%H
;启用性能检测分析
xdebug.profiler_enable=On
;允许收集传递给函数的参数变量
xdebug.collect_params= 4
;允许收集函数调用的返回值
xdebug.collect_return=On
;是否收集include、require的文件
xdebug.collect_includes = On
;是否收集内存的增加还是减少
;xdebug.show_mem_delta = On
;是否打印函数调用的最外围中的所有局部变量
;xdebug.show_local_vars = On
xdebug.profiler_enable = Off
;xdebug.profiler_output_dir = /tmp/xdebug
;xdebug.profiler_output_name = cachegrind.out.%H
注:设置“xdebug.auto_trace = On”时,将会在执行所有PHP脚本之前先自动启用跟踪;另外,你也可以设置为“xdebug.auto_trace = 0”,并在PHP脚本开头和结尾分别调用xdebug_start_trace()和 xdebug_stop_trace()函数开启和结束跟踪。如:
<?php
xdebug_start_trace();
//要追踪的代码
xdebug_stop_trace();
 
五、查看追踪日志:
  设置好配置文件后,并重启httpd服务,如果开启自动追踪,或者在脚本中使用xdebug_start_trace()和xdebug_stop_trace()函数开启追踪,那么在“/tmp/xdebug”命令下就可以看到追踪日志了。你可以使用vim查看他们,找出脚本中的问题。

附件:Xdebug详细参数表:
选项名类型默认值参数选项描述
xdebug.auto_tracebooleanOff是否在脚本运行之前自动调用相关追踪函数。
xdebug.cli_colorinteger0如果值=1:
  当处于CLI模式或连接虚拟控制台时,Xdebug将高亮显示var_dumps()和堆栈输出;在Windows中,这需要安装ANSICON工具。
如果值=2:
  不管是否处于CLI模式或连接虚拟控制台,Xdebug都会高亮显示var_dumps()或堆栈输出;这种情况下,你可能会看到转义后的代码。
该参数自2.2版本开始引入。
xdebug.collect_assignmentsbooleanOff用于控制是否为函数跟踪添加变量赋值功能。
该参数自2.1版本开始引入。
xdebug.collect_includesbooleanOn控制是否在跟踪文件中写入include()、include_once()、require()、require_once()等函数中用到的文件名。
xdebug.collect_paramsinteger0控制在调用函数时,是否收集传递给函数的参数信息。
  如果值=0,则不显示任何信息。
  如果值=1,只显示类型和大小信息,例如:string(6)、array(8)。
  如果值=2,将显示类型和大小,以及全部信息的工具提示。
  如果值=3,将显示变量的全部内容。
  如果值=4,将显示变量的全部内容和变量名。
如果参数值过大,这可能会占用大量的内存;不过,在Xdebug 2中不会出现该问题,因为Xdebug 2将相关数据写入磁盘中,而不是占用内存。
xdebug.collect_returnbooleanOff控制是否在追踪文件中写入函数调用的返回值。
xdebug.collect_varsbooleanOff控制是否收集指定作用域中的变量信息。由于需要反向工程PHP的操作码数组,因此Xdebug的分析速度可能比较慢。
xdebug.coverage_enablebooleanOn控制是否允许通过设置内部结构来启用代码覆盖率功能。
该参数自2.2版本开始引入。
xdebug.default_enablebooleanOn当发生异常或错误时,是否默认显示堆栈信息。
xdebug.dump.*stringEmpty这里的*可以是COOKIE, FILES, GET, POST, REQUEST, SERVER, SESSION中的任意一个。用于指定发生错误时是否显示超全局变量数组中的索引变量信息。比如,你想要显示请求的IP地址和请求方式,可以设置为xdebug.dump.SERVER=REMOTE_ADD,REQUEST_METHOD多个索引变量用英文逗号隔开,如果要输出其中的所有变量,可以直接用*,例如:xdebug.dump.GET=*
xdebug.dump_globalsbooleanOn控制是否显示通过xdebug.dump.*定义的所有超全局变量的信息。
xdebug.dump_oncebooleanOn如果出现多个错误,控制超全局变量信息是在所有错误中显示,还是只在第一个错误中显示。
xdebug.dump_undefinedbooleanOn控制是否显示超全局变量中未定义的值。
xdebug.extended_infointeger1是否强制进入PHP解析器的"extended_info"模式,这将允许Xdebug以远程调试器对文件或行添加断点。开启此模式将拖慢脚本的允许速度,该参数只能在php.ini中设置。
xdebug.file_link_formatstring,用于指定堆栈信息中用到的文件名称的链接样式,这允许IDE通过设置链接协议,直接点击堆栈信息中的文件名称,即可快速打开指定的文件。
例如:ZendStudio://%f@%l(%f表示文件路径,%f表示行号)。
自2.2版本开始引入。
xdebug.force_display_errorsinteger0是否强制显示错误信息。
自2.3版本开始引入。
xdebug.force_error_reportinginteger0是否强制显示所有错误级别的信息。
自2.3版本开始引入。
xdebug.halt_levelinteger0指定出现那些错误级别的错误时,中止程序运行。例如:xdebug.halt_level=E_WARNING|E_NOTICE|E_USER_WARNING|E_USER_NOTICE(也仅支持上述4种错误级别)。
自2.3版本开始引入。
xdebug.idekeystring*complex*指定传递给DBGp调试器处理程序的IDE Key。
xdebug.manual_urlstringhttp://www.php.net用于指定从函数堆栈和错误信息链接到的帮助手册的基本URL。
仅2.2.1以下版本可用。
xdebug.max_nesting_levelinteger100指定递归的嵌套层级数。
xdebug.overload_var_dumpbooleanOn当php.ini中的html_error设为1时,Xdebug是否默认使用自身的改进版本来重载var_dump()。
自2.2版本开始引入。
xdebug.profiler_appendinteger0当多个请求映射到相同文件时,指定是覆盖之前的调试信息文件还是追加内容到该文件中。
xdebug.profiler_enableinteger0指定是否启用Xdebug的性能分析,并创建性能信息文件。
xdebug.profiler_output_dirstring/tmp指定性能分析信息文件的输出目录
xdebug.profiler_output_namestringcachegrind.out.%p

 
指定性能分析信息文件的名称
xdebug.remote_enablebooleanOff是否开启远程调试
xdebug.remote_handlerstringdbgp指定远程调试的处理协议
xdebug.remote_hoststringlocalhost指定远程调试的主机名
xdebug.remote_logstring 指定远程调试的日志文件名
xdebug.remote_modestringreq可以设为req或jit,req表示脚本一开始运行就连接远程客户端,jit表示脚本出错时才连接远程客户端。
xdebug.remote_portinteger9000指定远程调试的端口号
xdebug.trace_optionsinteger0指定对于之后的请求,追踪文件是追加内容还是覆盖之前内容。
xdebug.trace_output_dirstring/tmp指定追踪文件的存放目录
xdebug.trace_output_namestringtrace.%c指定追踪文件的名称
xdebug.show_exception_tracebooleanOff是否开启异常跟踪
xdebug.show_mem_deltabooleanOff是否追踪内存的变化
xdebug.show_local_varsbooleanOff是否显示局部变量 

PHP魔术方法合集

PHPlinyu520 发表了文章 • 0 个评论 • 197 次浏览 • 2016-11-17 13:28 • 来自相关话题

  PHP 将所有以“__”(两个下划线)开头的类方法保留为魔术方法。所以在定义类方法时,除了上述魔术方法,建议不要以“__”为前缀。魔术方法描述__construct()初始化一个对象时触发;__destruct()对象销毁,或者脚本执行完时触发;__autoload()当使用一个不可访问的类时触发;__clone()对象被克隆时触发;__get()获取一个不可访问(属性不存在、或者无权限)的属性时触发;__set()为一个不可访问的属性赋值的时候触发;__isset()当用isset()函数判断一个不可访问的属性时触发;__unset()当用unset()函数操作一个不可访问的属性时触发;__call()当调用一个不可访问的方法时触发;__callStatic()当调用一个不可访问的静态方法时触发;__toString()当一个对象被当做字符串来操作时触发;
如$obj是一个对象,echo $obj,就会触发__toString();__invoke()当一个对象被当做函数来使用时触发;
如$obj是一个对象,$obj()就会触发__invoke();__sleep()在将使用serialize时触发;__wakeup()在使用unserialize后触发;__set_state()当调用var_export()导出类时触发(PHP 5.1.0起);__debugInfo() 当调用var_dump()导出一个对象时调用(PHP 5.6.0起); 
用法演示:
1、__autoload()魔术方法:
__autoload()是我们最为常用的魔术方法,常常用于自定加载类文件,做到按需加载:<?php
//爱E族 aiezu.com
function __autoload($class) {
if (class_exists($class, false)) return;
$file = sprintf("./class/%s.php", str_replace('_', DIRECTORY_SEPARATOR, $class));
require_once($file);
}
// 当类Core_Db不存在时,自动引入类文件:./class/Core/Db.php
$db = new Core_Db(); 
2、__debugInfo()魔术方法:
<?php
class Aiezu {
private $name;
public function __construct($name) {
$this->name = $name;
}
public function __debugInfo() {
return array('SiteName'=> $this->name);
}
}
var_dump(new Aiezu('爱E族'));​PHP 5.6.0以下版本运行结果:object(Aiezu)#1 (1) {
["name":"Aiezu":private]=>
string(7) "爱E族"
}PHP 5.6.0以上版本运行结果:object(Aiezu)#1 (1) {
["SiteName"]=>
string(7) "爱E族"

3、__sleep()魔术方法:<?php
class Aiezu {
private $name;
private $url = 'aiezu.com';
public function __construct($name) {
$this->name = $name;
}
public function __sleep() {
return array('url'); //指定要序列化的属性列表
}
}
echo serialize(new Aiezu('爱E族'));输出:O:5:"Aiezu":1:{s:10:"Aiezuurl";s:9:"aiezu.com";} 查看全部
  PHP 将所有以“__”(两个下划线)开头的类方法保留为魔术方法。所以在定义类方法时,除了上述魔术方法,建议不要以“__”为前缀。
魔术方法描述
__construct()初始化一个对象时触发;
__destruct()对象销毁,或者脚本执行完时触发;
__autoload()当使用一个不可访问的类时触发;
__clone()对象被克隆时触发;
__get()获取一个不可访问(属性不存在、或者无权限)的属性时触发;
__set()为一个不可访问的属性赋值的时候触发;
__isset()当用isset()函数判断一个不可访问的属性时触发;
__unset()当用unset()函数操作一个不可访问的属性时触发;
__call()当调用一个不可访问的方法时触发;
__callStatic()当调用一个不可访问的静态方法时触发;
__toString()当一个对象被当做字符串来操作时触发;
如$obj是一个对象,echo $obj,就会触发__toString();
__invoke()当一个对象被当做函数来使用时触发;
如$obj是一个对象,$obj()就会触发__invoke();
__sleep()在将使用serialize时触发;
__wakeup()在使用unserialize后触发;
__set_state()当调用var_export()导出类时触发(PHP 5.1.0起);
__debugInfo() 当调用var_dump()导出一个对象时调用(PHP 5.6.0起);
 
用法演示:
1、__autoload()魔术方法:
__autoload()是我们最为常用的魔术方法,常常用于自定加载类文件,做到按需加载:
<?php
//爱E族 aiezu.com
function __autoload($class) {
if (class_exists($class, false)) return;
$file = sprintf("./class/%s.php", str_replace('_', DIRECTORY_SEPARATOR, $class));
require_once($file);
}
// 当类Core_Db不存在时,自动引入类文件:./class/Core/Db.php
$db = new Core_Db();
 
2、__debugInfo()魔术方法:
<?php
class Aiezu {
private $name;
public function __construct($name) {
$this->name = $name;
}
public function __debugInfo() {
return array('SiteName'=> $this->name);
}
}
var_dump(new Aiezu('爱E族'));
​PHP 5.6.0以下版本运行结果:
object(Aiezu)#1 (1) {
["name":"Aiezu":private]=>
string(7) "爱E族"
}
PHP 5.6.0以上版本运行结果:
object(Aiezu)#1 (1) {
["SiteName"]=>
string(7) "爱E族"
}
 
3、__sleep()魔术方法:
<?php
class Aiezu {
private $name;
private $url = 'aiezu.com';
public function __construct($name) {
$this->name = $name;
}
public function __sleep() {
return array('url'); //指定要序列化的属性列表
}
}
echo serialize(new Aiezu('爱E族'));
输出:
O:5:"Aiezu":1:{s:10:"Aiezuurl";s:9:"aiezu.com";}

PHP判断键名是否存在的方法

回复

PHP匿名用户 回复了问题 • 1 人关注 • 1 个回复 • 229 次浏览 • 2016-11-17 00:08 • 来自相关话题

PHP自定义异常处理函数

PHPlinyu520 发表了文章 • 0 个评论 • 242 次浏览 • 2016-11-16 13:56 • 来自相关话题

  我们常需要根据项目的不同,对代码运行日志记录有不同的需求。这不同的需求包含,需要记录的内容不同、记录的格式不同、日志的输出方式(写如文件、发EMail、发短信等)不同。这时,我们可以将自己的日志记录需求实现方法定义到一个类中,然后再通过下面这些函数,将类的方法注册到对应的事件,这样当事件发生时,系统自定会按我们的需求将日志记录到指定的地方。

一、register_shutdown_function函数:
  register_shutdown_function()函数用来设置当PHP脚本执行完成、或者exit()退出时要调用的函数。register_shutdown_function(array('Err','shutdown_function'));  
二、set_error_handler函数:
  set_error_handler函数使用来设置脚本发生错误时调用的函数,用法如下:set_error_handler(array('Err','error_handler'));通过 set_error_handler() 函数设置用户自定义的错误处理程序,然后触发错误(通过 trigger_error()):

三、set_exception_handler函数:set_exception_handler(array('Err','appException'));
简单示例:<?php
date_default_timezone_set('PRC');
register_shutdown_function(array('Err','successHandle'));
set_error_handler(array('Err','errorHandler'));
set_exception_handler(array('Err','exceptionHandle'));
class Err {
private static $logFile = 'log.txt';
//脚本发生错误
public static function errorHandler($errno, $errstr, $errfile, $errline){
$msg = sprintf("Error: %s %s %s:%s", $errno, $errstr, $errfile, $errline);
self::writeLog($msg);
}

//脚本执行完成
public static function successHandle() {
self::writeLog("Success.");
}

//脚本抛出异常
public static function exceptionHandle($exception) {
$msg = sprintf("Exception: %s", $exception->getMessage());
self::writeLog($msg);
}

//写日志
private static function writeLog( $msg ) {
$msg = sprintf("%s %s\t%s\n", date('Y-m-d H:i:s'), $_SERVER['REMOTE_ADDR'], $msg);
file_put_contents(self::$logFile, $msg, FILE_APPEND);
}
}

throw new Exception("发生异常啦"); 查看全部
  我们常需要根据项目的不同,对代码运行日志记录有不同的需求。这不同的需求包含,需要记录的内容不同、记录的格式不同、日志的输出方式(写如文件、发EMail、发短信等)不同。这时,我们可以将自己的日志记录需求实现方法定义到一个类中,然后再通过下面这些函数,将类的方法注册到对应的事件,这样当事件发生时,系统自定会按我们的需求将日志记录到指定的地方。

一、register_shutdown_function函数:
  register_shutdown_function()函数用来设置当PHP脚本执行完成、或者exit()退出时要调用的函数。
register_shutdown_function(array('Err','shutdown_function'));
  
二、set_error_handler函数:
  set_error_handler函数使用来设置脚本发生错误时调用的函数,用法如下:
set_error_handler(array('Err','error_handler'));
通过 set_error_handler() 函数设置用户自定义的错误处理程序,然后触发错误(通过 trigger_error()):

三、set_exception_handler函数:
set_exception_handler(array('Err','appException'));

简单示例:
<?php
date_default_timezone_set('PRC');
register_shutdown_function(array('Err','successHandle'));
set_error_handler(array('Err','errorHandler'));
set_exception_handler(array('Err','exceptionHandle'));
class Err {
private static $logFile = 'log.txt';
//脚本发生错误
public static function errorHandler($errno, $errstr, $errfile, $errline){
$msg = sprintf("Error: %s %s %s:%s", $errno, $errstr, $errfile, $errline);
self::writeLog($msg);
}

//脚本执行完成
public static function successHandle() {
self::writeLog("Success.");
}

//脚本抛出异常
public static function exceptionHandle($exception) {
$msg = sprintf("Exception: %s", $exception->getMessage());
self::writeLog($msg);
}

//写日志
private static function writeLog( $msg ) {
$msg = sprintf("%s %s\t%s\n", date('Y-m-d H:i:s'), $_SERVER['REMOTE_ADDR'], $msg);
file_put_contents(self::$logFile, $msg, FILE_APPEND);
}
}

throw new Exception("发生异常啦");

PHP fwrite 与 file_put_contents 两个函数的区别

PHPlinyu520 发表了文章 • 0 个评论 • 499 次浏览 • 2016-11-16 11:00 • 来自相关话题

一、fwrite函数和file_put_contents函数的区别:
  fwrite()函数和file_put_contents()函数都是将字符串写入到文件,但它们又有一定区别,具体如下表:函数名功能简介fwrite()将字符串写入或追加到文件中;
写入文件前,需使用fopen()函数打开文件,
写入文件后,需使用fclose()函数关闭文件。file_put_contents()将字符串写入或追加到文件中;
函数会自动执行打开文件、写入文件、关闭文件操作。 
二、写入文件演示:
1、使用fwrite函数将字符串写入文件:<?php
//以从文件头开始写入的方式打开文件,会覆盖文件原有的内容
$handle = fopen('a.txt', 'w');
$num = fwrite($handle, "爱E族\n");
fclose($handle);
echo $num; //输出:8(汉字为3字节,E和换行符各一个字节) 
2、使用file_put_contents函数将字符串写入到文件:<?php
$num = file_put_contents('b.txt', "爱E族\n");
echo $num; // 输出:8 
三、追加文件演示:
1、使用fwrite函数追加文件:<?php
//以追加的方式打开文件,将文件尾部开始写入,不会覆盖原有内容
$handle = fopen('a.txt', 'a');
$num = fwrite($handle, "Aiezu.com\n");
fclose($handle);
echo $num; //输出:10 
2、使用file_put_contents函数追加文件:<?php
// LOCK_EX: 写文件的时候先锁定,防止多人同时写入造成内容丢失
$num = file_put_contents('b.txt', "Aiezu.com\n", FILE_APPEND|LOCK_EX);
echo $num; // 输出:10 
四、性能比较:
1、写入性能比较:<?php
$num = 1000;

$start = microtime(true);
for($i=1; $i<=$num; $i++) {
file_put_contents('b.txt', "Aiezu.com\n");
}
$time = microtime(true)-$start;
echo sprintf("file_put_contents函数写入%d次耗时%.3f秒\n", $num, $time);


$start = microtime(true);
for($i=1; $i<=$num; $i++) {
$handle = fopen('a.txt', "w");
fwrite($handle, "Aiezu.com\n");
fclose($handle);
}
$time = microtime(true)-$start;
echo sprintf("fwrite函数写入%d次耗时%.3f秒\n", $num, $time);输出:file_put_contents函数写入1000次耗时0.994秒
fwrite函数写入1000次耗时1.108秒
本例可以看出,对于覆写文件内容,file_put_contents函数会比fwrite函数稍快。
2、追加内容性能比较:<?php
$num = 100000;

$start = microtime(true);
for($i=1; $i<=$num; $i++) {
file_put_contents('a.txt', "爱E族", FILE_APPEND);
}
$time = microtime(true)-$start;
echo sprintf("file_put_contents函数追加内容%d次耗时%.3f秒\n", $num, $time);

$start = microtime(true);
for($i=1; $i<=$num; $i++) {
$handle = fopen('b.txt', "a");
fwrite($handle, "爱E族");
fclose($handle);
}
$time = microtime(true)-$start;
echo sprintf("fwrite一次打开追加内容一次,重复%d次耗时%.3f秒\n", $num, $time);

$start = microtime(true);
$handle = fopen('c.txt', "a");
for($i=1; $i<=$num; $i++) {
fwrite($handle, "爱E族");
}
fclose($handle);
$time = microtime(true)-$start;
echo sprintf("fwrite一次打开,追加内容%d次耗时%.3f秒\n", $num, $time);输出:file_put_contents函数追加内容100000次耗时0.765秒
fwrite一次打开追加内容一次,重复100000次耗时0.580秒
fwrite一次打开,追加内容100000次耗时0.112秒  本例可以看出,对于追加文件内容来说,fwrite函数比file_put_contents函数快很多,如果是fwrite一次打开写入多次,那更是快很多倍。
  通过上面两例,发现更令人惊奇的一点,两个函数的追加内容比覆写内容,快近百倍,这是为什么呢?大家可以亲自测一下。
 
五、总结:
  写入少量内容,单次写入,我们建议使用file_put_contents函数、一行代码,简单方便,性能也不错。对于连续写入多次,或者写入大块内容,建议使用fwrite函数配合其他函数,使用二进制流的方式,边读边写,减少内存占用。 查看全部
一、fwrite函数和file_put_contents函数的区别:
  fwrite()函数和file_put_contents()函数都是将字符串写入到文件,但它们又有一定区别,具体如下表:
函数名功能简介
fwrite()将字符串写入或追加到文件中;
写入文件前,需使用fopen()函数打开文件,
写入文件后,需使用fclose()函数关闭文件。
file_put_contents()将字符串写入或追加到文件中;
函数会自动执行打开文件、写入文件、关闭文件操作。
 
二、写入文件演示:
1、使用fwrite函数将字符串写入文件:
<?php
//以从文件头开始写入的方式打开文件,会覆盖文件原有的内容
$handle = fopen('a.txt', 'w');
$num = fwrite($handle, "爱E族\n");
fclose($handle);
echo $num; //输出:8(汉字为3字节,E和换行符各一个字节)
 
2、使用file_put_contents函数将字符串写入到文件:
<?php
$num = file_put_contents('b.txt', "爱E族\n");
echo $num; // 输出:8
 
三、追加文件演示:
1、使用fwrite函数追加文件:
<?php
//以追加的方式打开文件,将文件尾部开始写入,不会覆盖原有内容
$handle = fopen('a.txt', 'a');
$num = fwrite($handle, "Aiezu.com\n");
fclose($handle);
echo $num; //输出:10
 
2、使用file_put_contents函数追加文件:
<?php
// LOCK_EX: 写文件的时候先锁定,防止多人同时写入造成内容丢失
$num = file_put_contents('b.txt', "Aiezu.com\n", FILE_APPEND|LOCK_EX);
echo $num; // 输出:10
 
四、性能比较:
1、写入性能比较:
<?php
$num = 1000;

$start = microtime(true);
for($i=1; $i<=$num; $i++) {
file_put_contents('b.txt', "Aiezu.com\n");
}
$time = microtime(true)-$start;
echo sprintf("file_put_contents函数写入%d次耗时%.3f秒\n", $num, $time);


$start = microtime(true);
for($i=1; $i<=$num; $i++) {
$handle = fopen('a.txt', "w");
fwrite($handle, "Aiezu.com\n");
fclose($handle);
}
$time = microtime(true)-$start;
echo sprintf("fwrite函数写入%d次耗时%.3f秒\n", $num, $time);
输出:
file_put_contents函数写入1000次耗时0.994秒
fwrite函数写入1000次耗时1.108秒

本例可以看出,对于覆写文件内容,file_put_contents函数会比fwrite函数稍快。
2、追加内容性能比较:
<?php
$num = 100000;

$start = microtime(true);
for($i=1; $i<=$num; $i++) {
file_put_contents('a.txt', "爱E族", FILE_APPEND);
}
$time = microtime(true)-$start;
echo sprintf("file_put_contents函数追加内容%d次耗时%.3f秒\n", $num, $time);

$start = microtime(true);
for($i=1; $i<=$num; $i++) {
$handle = fopen('b.txt', "a");
fwrite($handle, "爱E族");
fclose($handle);
}
$time = microtime(true)-$start;
echo sprintf("fwrite一次打开追加内容一次,重复%d次耗时%.3f秒\n", $num, $time);

$start = microtime(true);
$handle = fopen('c.txt', "a");
for($i=1; $i<=$num; $i++) {
fwrite($handle, "爱E族");
}
fclose($handle);
$time = microtime(true)-$start;
echo sprintf("fwrite一次打开,追加内容%d次耗时%.3f秒\n", $num, $time);
输出:
file_put_contents函数追加内容100000次耗时0.765秒
fwrite一次打开追加内容一次,重复100000次耗时0.580秒
fwrite一次打开,追加内容100000次耗时0.112秒
  本例可以看出,对于追加文件内容来说,fwrite函数比file_put_contents函数快很多,如果是fwrite一次打开写入多次,那更是快很多倍。
  通过上面两例,发现更令人惊奇的一点,两个函数的追加内容比覆写内容,快近百倍,这是为什么呢?大家可以亲自测一下。
 
五、总结:
  写入少量内容,单次写入,我们建议使用file_put_contents函数、一行代码,简单方便,性能也不错。对于连续写入多次,或者写入大块内容,建议使用fwrite函数配合其他函数,使用二进制流的方式,边读边写,减少内存占用。