mysql_query函数查询的方式是查询出全部结果后缓存到内存中,这样就会出现超内存的现象,使用另外一个函数mysql_unbuffered_query可以解决这个问题,mysql_unbuffered_query不会缓存结果集,而是查询出来数据后立马对结果集进行操作,也就是便查询边返回,这样就不会出现超出内存的现象,但是使用mysql_unbuffered_query的是时候不能使用 mysql_num_rows() 和 mysql_data_seek().并且向 MySQL 发送一条新的 SQL 查询之前,必须提取掉所有未缓存的 SQL 查询所产生的结果行.例如:
使用缓存结果集的代码:
function selecttest()
{
try {
// 不使用缓存结果集方式
// $pdo-setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
$sth = $pdo-prepare('select * from test');
$sth-execute();
echo '最初占用内存大小:' . memory_get_usage() . "\n";
$i = 0;
while ($result = $sth-fetch(PDO::FETCH_ASSOC)) {
$i += 1;
if ($i 10) {
break;
}
sleep(1);
print_r($result);
echo '占用内存大小:' . memory_get_usage() . "\n";
} catch (Exception $e) {
echo $e-getMessage();
执行时将会报超出内存的错误:
Call Stack:
将上面代码中的$pdo-setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);一行的注释去掉后将不在缓存结果集,这时运行该函数的结果如下:
Array
(
[id] = 1
[a] = v
[b] = w
[c] = i
)
[a] = b
[b] = l
[c] = q
[a] = m
[b] = p
[c] = h
[a] = j
[b] = i
[c] = b
链接:
PHP教程.安装PHP
安装PHP
本章将按下列步骤编译安装以下软件:
* expact -- 用于读取和处理XML文档的函数库.
* phplib -- 用于进行会话管理的PHP函数库.
* libiodbc -- 主要用于存取在非UNIX计算机中数据库的ODBC函数库.
* MyODBC -- PHP、iODBC和MySQL之间的函数库.
即便如此,本章也并不是介绍编译应用程序所需要的那些指令,而只是简单的进行描述.都说到这里了大家应该明白,本书的重点是介绍PHP语言,而不是C语言.每一个应用程序的编译对我来说都十分清楚,希望每个读者也能没有困难的进行编译.假如你确实碰到了一些问题,可以在某个IRC频道中有礼貌的询问,或者可以尝试使用新闻组(可以从访问)得到帮助来解决问题.然而,最好的帮助还是来自 上的PHP邮件列表.
在开始编译过程之前,让我们先讨论一下如何从错误中恢复.在得到有关错误的帮助以后,可以采用以下的命令重新初始化源码目录:
* rm config.cache--几乎所有的Linux应用程序都使用configure命令来检查自己的系统,以寻找有关如何剪裁编译过程的信息.检查的结果将存贮在一个名为config.cache的文件中.如果移走此文件,将迫使配置程序从头开始重新检查系统.
* make distclean--所有的用C语言编写的Linux应用程序都是用make程序编译的.make程序会寻找每一个源文件,以确认是需要编译还是已经编译过的.make distclean命令可以"重置"所有的源程序,以便能重新编译它们.
* make clean--有的应用程序不支持make distclean命令,而用make clean命令来代替.make clean命令"重置"所有的源程序,以便能重新编译它们.
即使要安装的一些应用程序不支持以上的每个命令,但是试一下这些命令也不会有什么害处.
也许读者以前从没有编译过Linux应用程序,今天这一节介绍一些基本概念,以便在出现问题时有可能诊断出问题所在.
tar
tar,即tape archiver,它可以把几个文件组合成一个文件,并可以选择是否进行压缩.这个命令过去通常用来进行备份,以便使数据存储在磁带中.当tar文件被压缩时,它们有一个.gz的后缀;当tar文件没有压缩时,它们有一个.tar的后缀.
gcc
gcc 是GNU的C编译器.它的工作是把人可以看懂的源代码文件编译成机器可以读懂的目标文件.C源文件通常有.c的后缀名,目标文件通常有.o的后缀名.如果编译工作不能正常进行,就是碰到了一个编译期的错误,或者说:语法错误.在大多数情况下,不彻底的编译通常是编译器找不到一个或几个包含文件而产生的.包含文件都有一个.h的扩展名,通常用来定义不同的系统信息,以及将多个不同的.c文件所共有的信息收集在一起.
make
ld
ld是GNU的链接程序.它的工作是把所有的目标文件和库链接起来,创建一个单一的可执行文件.幸运的是,基本上不用手工运行这个程序,因为Makefile将会考虑到所有的编译细节.
ldconfig
./configure
configure将会在计算机中寻找一些关键信息,例如,安装的是哪一种C编译器,包含文件在哪里等等.然后,configure将会按照所用的计算机配置重新修改Makefile文件.应该使用./configure来在当前目录下运行程序,以避免偶然运行$PATH环境变量中的目录下的其他程序.
符号连接
以下步骤将为系统做好编译前的准备工作.
① mkdir /usr/local/src -- 我选用/usr/local树作为所安装应用程序的根目录.其他人可能选用/usr/opt、/opt或/var目录.为了更方便的按照本章中的指令操作,请选用/usr/local目录作为根目录.当编译完成以后,用户可以把这些文件复制到不同的目录中.
注意:为了能完成本章中的其它步骤,使用者必须具备root权限.
. expat.tar.gz
. phplib.tar.gz
tar xvzf expat.tar.gz
tar xvzf phplib.tar.gz
如果需要,把现有的gcc备份,以便以后使用.Linux的另一个优点是可以很容易在目录下存储一个程序的多个版本.
如果需要,把现有的Apache备份,以便以后使用.
编译新版本的gcc需要执行:
转到gcc的顶级目录下.
运行配置程序,强制安装程序在后面的安装过程中使用/usr/local/gcc作为gcc的安装目录.
编译新的C和C++编译器.
安装新的C和C++编译器.
把新的gcc编译器重新命名,使它的名字中含有版本号.
/usr/bin/gcc-
给新编译过的gcc可执行文件创建一个符号连接/usr/bin/gcc.
现在来编译MySQL.在编译工作完成之后,就可以使用MySQL的应用程序来测试安装.
转到MySQL的顶级目录下.
运行配置程序,强制安装程序在后面的安装过程中使用/usr/local/mysql作为MySQL的安装目录.
编译MySQL.
安装MySQL.
将MySQL库所在的目录添加进配置文件中.这样,当Linux启动或者执行ldconfig命令时,将会在该配置文件中的目录里搜索库文件.
ldconfig命令能读取/etc/ld.so.conf文件中列出的目录,并对在那些目录里找到的库文件进行缓冲.grep命令在ldconfig命令的大量输出结果中查找MySQL库文件,并限定文本以类似下面方式进行显示:
将MySQL启动指令添加到/etc/rc.d/rc.local文件中,这样每次启动Linux后就会自动运行MySQL.
初始化数据库.
启动MySQL服务器作为后台程序,为了测试安装,MySQL服务器必须启动.
①.0. ln -s \
/usr/local/mysql/bin/mysql \
/usr/bin/mysql
我比较喜欢在/usr/bin目录下为安装目录建立符号链接.这一方法减少了PATH环境变量中的目录数量,还可以将不希望其他人运行的MySQL工具程序隐藏起来,(例如,mysqladmin命令).另一方法是将命令PATH="$PATH:/usr/local/mysql/bin"放在/etc/profile文件中.以上两种方法都很可以采用.
①.1. ln -s\
/usr/local/mysql/bin/mysqlshow \
/usr/bin/mysqlshow
该指令是让一般用户都可以运行mysqlshow命令.
在继续Apache和PHP编译之前,首先来测试MySQL的安装是否成功.正式发布的MySQL带有许多有用的工具,这里我们只使用mysql和mysqlshow命令来进行测试.(如果对数据库不熟悉,请不用担心,诸如用户、表、记录等数据库的概念将在第六章"数据库和SQL"中加以介绍.)
mysqladmin的作用是建立和删除数据库、检查SQL的状态,以及其他一些用途.首先,通过检查版本号以确认是否已经正确安装了MySQL:
PATH="usr/local/mysql/bin:$PATH"
mysqladmin version
Protocol version 10
Connection Localhost via UNIX socket
UNIX socket /tmp/mysql.sock
可以用以下命令观看mysqladmin的所有功能.
mysqladmin --help | less
也许mysqlshow是更让人激动的工具,它能够列出数据库、表和字段名,如下所示:
最后要介绍的MySQL工具是mysql,这个程序将深入到MySQL的中心,并且可以使你可以立刻在Linux命令行提示下执行SQL语句.在shell模式下运行mysql.
小心:设置密码要使用password()函数.如果需要进一步了解,请查阅MySQL文档.
小心:在系统进入正常工作模式的时候,请选用一个比"password"更好的root密码.
iODBC是一个实现开放性数据库互连(Open Database connectivity)协议的函数库.它主要用于连接运行于Microsoft Windows的数据库引擎.
转到iODBC目录.
--prefix=/usr/local/iodbc \
--with-iodbc-inidir=/usr/local/etc
运行配置程序,并强制设置iODBC为安装到目录/usr/local/iodbc下.此外,应确认odbc的初始化文件为/etc/odbc.ini.
把库文件复制到目录/usr/local/iodbc/lib下,并且把包含文件复制到目录/usr/local/iodbc/include下.
转到MyODBC目录下.
--prefix=/usr/local/myodbc \
--with-odbc-ini=/etc/odbc.ini \
--with-iodbc=/usr/local/iodbc
运行MyODBC配置程序.
把库复制到目录/usr/local/myodbc/lib下.
编译PHP比编译以前的应用程序更复杂,这是因为编译PHP事实上是expat、Apache和PHP的组合.编译的结果将生成一个带有PHP的Apache版本.为了要编译PHP,可以采用以下步骤:
① cd /usr/local/src/expat
转到expat目录.
编译expat源文件.
libexpat.a: $(OBJS)
ar -rc $@ $(OBJS)
ranlib $@
把expat目标文件组合成库文件.
PHP配置文件在/usr/local/lib目录下寻找libexpat.a文件.把libexpat.a文件移到PHP配置文件已知的目录下,可以为以后的操作减少麻烦.
转到PHP的顶级目录下.
确认/usr/local/include/xml目录是存在的.
/usr/local/src/expat/xmltok/xmltok.h \
/usr/local/include/xml/xmltok.h
当能创建符号连接时,为什么还要复制呢?
/usr/local/src/expat/xmlparse.h \
/usr/local/include/xml/xmlparse.h
这是PHP为了能够正确地被编译所需要的另一个包含文件.
转到Apache的顶级目录下.
①.1. ./configure -prefix=/usr/local/apache
运行配置程序,强制设置Apache安装目录为/usr/local/apache.
--with-iodbc=/usr/local/iodbc \
--with-mysql=/usr/local/mysql \
--with-xml
运行配置程序,并且告诉配置程序支持Apache、MySQL和XML.
编译PHP源文件.
安装已编译的文件.PHP库文件会被放在Apache的模块目录下,这样可以在编译Apache时能找到它们.
--prefix=/usr/local/apache \
再一次配置Apache,这次告诉Apache要加载PHP模块.
编译Apache源文件.
安装已编译的文件.
/usr/local/apache/bin/httpd \
重新命名新创建的httpd可执行文件,这样就能够安装多种版本.
/usr/sbin/httpd
建立一个指向新的可执行文件的符号链接.
include_path=.:/usr/local/apache/php/
track_vars = on
magic_quotes_gpc = on
sendmail_path /usr/sbin/sendmail -t
建立一个符号链接,这样绝大多数Web浏览器就会正确地自动显示PHP文件起始页.
/usr/local/apache/htdocs/phpdocs
建立一个符号链接,这样就可以通过, 来访问PHP文档.
#robots.txt for (hostname)
User-agent *
Disallow: /phpdocs/
Disallow: /php/
Disallow:/phpMyAdmin/
① 以root用户或其他任何可以在/usr/local/apache目录下写文件的用户注册.
解压缩PHPLIB模块.
auto_prepend_file = /usr/local/apache/phplib-
进入建表目录下.
create_database.mysql
创建PHPLIB所需要的数据库表.
host: %
password: -- no password.
select_priv: Yes
insert_priv: Yes
update_priv: Yes
delete_priv: Yes
注意:也可以使用如下SQL语句:
INSERT INTO
user
Host
,User
,Password
,Select_priv
,Insert_priv
,Update_priv
,Delete_priv
VALUES (
'%'
, 'kris'
, ''
, 'Y', 'Y', 'Y', 'Y'
①.0. 使用以下值在mysql数据库的db表中增加一条新记录:
db: poe_sessions
注意:也可以使用如下SQL程序.
db
,Db
, 'poe_sessions '
①.1. /usr/local/mysql/bin/mysqladmin -u root -p reload
重新装载MySQL权限表.
auto_user
uid
,username
,password
,perms
) VALUES (
,'user01'
,'test'
,'admin'
auth_user
/use/local/apach/htdocs
将演示子目录置于Web服务器的根目录下,这样就可以用浏览器访问它.
Disallow: /phplib/
;
;odbc.ini
[ODBC Data Sources]
mysql = mysql
[php_book]
driver = /usr/local/myodbc/lib/libmyodbc.so
host = localhost
database = mysql
user = root
运行ODBC测试程序.
告诉测试程序要访问的数据源.
在提示符下执行一个SQL语句,如果有回应,说明iODBC和MySQL已经可以使用了.
现在,在计算机中已经安装好了ODBC,由于它的安装步骤不太清晰而且文档又很少,所以本章中讲述了其安装和测试指令,然而鉴于ODBC主要是一项Microsoft技术,且很少在Linux中用到,所以这里是本书中最后一次有关介绍.