安装Pdo扩展 for freebsd6.2 Php5
*php5-extensions
ZLIB
PDO
这两项选中
对mysql的链接驱动
#/usr/ports/databases/php5-pdo_mysql
#make install clean
restart apache
humen1 Tech
*php5-extensions
ZLIB
PDO
这两项选中
对mysql的链接驱动
#/usr/ports/databases/php5-pdo_mysql
#make install clean
restart apache
humen1 Tech
先来看看PHP MANUAL对PDO的定义。
[原文]
The PHP Data Objects (PDO) extension defines a lightweight, consistent interface for accessing databases in PHP. Each database driver that implements the PDO interface can expose database-specific features as regular extension functions. Note that you cannot perform any database functions using the PDO extension by itself; you must use a database-specific PDO driver to access a database server.
PDO provides a data-access abstraction layer, which means that, regardless of which database you’re using, you use the same functions to issue queries and fetch data. PDO does not provide a database abstraction; it doesn’t rewrite SQL or emulate missing features. You should use a full-blown abstraction layer if you need that facility.
[译文]
PDO扩展为PHP定义了一个访问数据库的轻量的,持久的接口。实现了PDO接口的每一种数据库驱动都能以正则扩展的形式把他们各自的特色表现出来。注意;利用PDO扩展本身并不能实现任何数据库函数。你必须使用一个特定的数据库PDO驱动去访问数据库。
PDO提供了一个数据访问抽象层,这就意味着,不管你使用的是哪种数据库,你都可以用同样的函数去进行查询的获取数据。PDO并不提供数据提取,它不会重写SQL语句,或者模仿这些 功能。你需要使用一个成熟的提取层,如果你需要的话。
怎么样,是不是看了译文就有一种恍然大悟的感觉了?
没有?
那说的再详细点。
我们为什么要使用PDO?
1、更换数据库时取得极大便利
在PHP4/3时代,PHP要利用php_mysql.dll、php_pgsql.dll、php_mssql.dll、php_sqlite.dll等等扩展来连接MySQL、PostgreSQL、MS SQL Server、SQLite,这其实也没什么。也就是在配置时多添句话就行了。
可怕的是,这些扩展和各自对应的数据库打交道时,他们各自的函数有很多是不一样的。
比如:
PHP利用libmysql.dll和MYSQL打交道时,如果要从数据表中提取数据作为关联数组,用的是mysql_fetch_accoc,而如果要从postgre数据库取得同样的结果,你就不得不用pg_fetch_assoc。
很简单的例子说明了很重要的问题,假如你要更换数据库类型,比如从MYSQL更换成POSTGRE,你就不得把你所有和数据库有关的程序都改一遍。这时候,你应该会明白,为什么我不用PDO??
2、极大提高程序运行效率
针对上面的情况,也许你会说,我可以使用ADODB(LITE),PEAR::db来实现对不同类型数据库函数的封装啊。这样子,即使我更换数据库,也不需要修改程序。
答:php代码的效率怎么能够和直接用C/C++写的扩展效率比较呢?根本不是一个数量级的。
OK,从现在开始用PDO进行你的开发吧。
humen1 Tech
一、我们可以且应该优化什么?
硬件
操作系统/软件库
SQL服务器(设置和查询)
应用编程接口(API)
应用程序
--------------------------------------------------------------------------------
二、优化硬件
如果你需要庞大的数据库表(>2G),你应该考虑使用64位的硬件结构,像Alpha、Sparc或即将推出的IA64。因为MySQL内部使用大量64位的整数,64位的CPU将提供更好的性能。
对大数据库,优化的次序一般是RAM、快速硬盘、CPU能力。
更多的内存通过将最常用的键码页面存放在内存中可以加速键码的更新。
如果不使用事务安全(transaction-safe)的表或有大表并且想避免长文件检查,一台UPS就能够在电源故障时让系统安全关闭。
对于数据库存放在一个专用服务器的系统,应该考虑1G的以太网。延迟与吞吐量同样重要。
--------------------------------------------------------------------------------
三、优化磁盘
为系统、程序和临时文件配备一个专用磁盘,如果确是进行很多修改工作,将更新日志和事务日志放在专用磁盘上。
低 寻道时间对数据库磁盘非常重要。对与大表,你可以估计你将需要log(行数)/log(索引块长度/3*2/(键码长度 + 数据指针长度))+1次寻到才能找到一行。对于有500000行的表,索引Mediun int类型的列,需要log(500000) / log(1024/3*2/(3 + 2))+1=4次寻道。上述索引需要500000*7*3/2= 5.2M的空间。实际上,大多数块将被缓存,所以大概只需要1-2次寻道。
然而对于写入(如上),你将需要4次寻道请求来找到在哪里存放新键码,而且一般要2次寻道来更新索引并写入一行。
对于非常大的数据库,你的应用将受到磁盘寻道速度的限制,随着数据量的增加呈N log N数据级递增。
将数据库和表分在不同的磁盘上。在MySQL中,你可以为此而使用符号链接。
条列磁盘(RAID 0)将提高读和写的吞吐量。
带镜像的条列(RAID 0+1)将更安全并提高读取的吞吐量。写入的吞吐量将有所降低。
不要对临时文件或可以很容易地重建的数据所在的磁盘使用镜像或RAID(除了RAID 0)。
在Linux上,在引导时对磁盘使用命令hdparm -m16 -d1以启用同时读写多个扇区和DMA功能。这可以将响应时间提高5~50%。
在Linux上,用async (默认)和noatime挂载磁盘(mount)。
对于某些特定应用,可以对某些特定表使用内存磁盘,但通常不需要。
--------------------------------------------------------------------------------
四、优化操作系统
不要交换区。如果内存不足,增加更多的内存或配置你的系统使用较少内存。
不要使用NFS磁盘(会有NFS锁定的问题)。
增加系统和MySQL服务器的打开文件数量。(在safe_mysqld脚本中加入ulimit -n #)。
增加系统的进程和线程数量。
如果你有相对较少的大表,告诉文件系统不要将文件打碎在不同的磁道上(Solaris)。
使用支持大文件的文件系统(Solaris)。
选择使用哪种文件系统。在Linux上的Reiserfs对于打开、读写都非常快。文件检查只需几秒种。
--------------------------------------------------------------------------------
五、选择应用编程接口
PERL
可在不同的操作系统和数据库之间移植。
适宜快速原型。
应该使用DBI/DBD接口。
PHP
比PERL易学。
使用比PERL少的资源。
通过升级到PHP4可以获得更快的速度。
C
MySQL的原生接口。
较快并赋予更多的控制。
低层,所以必须付出更多。
C++
较高层次,给你更多的时间来编写应用。
仍在开发中
ODBC
运行在Windows和Unix上。
几乎可在不同的SQL服务器间移植。
较慢。MyODBC只是简单的直通驱动程序,比用原生接口慢19%。
有很多方法做同样的事。很难像很多ODBC驱动程序那样运行,在不同的领域还有不同的错误。
问题成堆。Microsoft偶尔还会改变接口。
不明朗的未来。(Microsoft更推崇OLE而非ODBC)
ODBC
运行在Windows和Unix上。
几乎可在不同的SQL服务器间移植。
较慢。MyODBC只是简单的直通驱动程序,比用原生接口慢19%。
有很多方法做同样的事。很难像很多ODBC驱动程序那样运行,在不同的领域还有不同的错误。
问题成堆。Microsoft偶尔还会改变接口。
不明朗的未来。(Microsoft更推崇OLE而非ODBC)
JDBC
理论上可在不同的操作系统何时据库间移植。
可以运行在web客户端。
Python和其他
可能不错,可我们不用它们。
--------------------------------------------------------------------------------
六、优化应用
应该集中精力解决问题。
在编写应用时,应该决定什么是最重要的:
速度
操作系统间的可移植性
SQL服务器间的可移植性
使用持续的连接。.
缓存应用中的数据以减少SQL服务器的负载。
不要查询应用中不需要的列。
不要使用SELECT * FROM table_name…
测试应用的所有部分,但将大部分精力放在在可能最坏的合理的负载下的测试整体应用。通过以一种模块化的方式进行,你应该能用一个快速"哑模块"替代找到的瓶颈,然后很容易地标出下一个瓶颈。
如果在一个批处理中进行大量修改,使用LOCK TABLES。例如将多个UPDATES或DELETES集中在一起。
--------------------------------------------------------------------------------
七、应该使用可移植的应用
Perl DBI/DBD
ODBC
JDBC
Python(或其他有普遍SQL接口的语言)
你应该只使用存在于所有目的SQL服务器中或可以很容易地用其他构造模拟的SQL构造。www.mysql.com上的Crash-me页可以帮助你。
为操作系统/SQL服务器编写包装程序来提供缺少的功能。
--------------------------------------------------------------------------------
八、如果你需要更快的速度,你应该:
找出瓶颈(CPU、磁盘、内存、SQL服务器、操作系统、API或应用)并集中全力解决。
使用给予你更快速度/灵活性的扩展。
逐渐了解SQL服务器以便能为你的问题使用可能最快的SQL构造并避免瓶颈。
优化表布局和查询。
使用复制以获得更快的选择(select)速度。
如果你有一个慢速的网络连接数据库,使用压缩客户/服务器协议。
不要害怕时应用的第一个版本不能完美地移植,在你解决问题时,你总是可以在以后优化它。
--------------------------------------------------------------------------------
九、优化MySQL
挑选编译器和编译选项。
位你的系统寻找最好的启动选项。
通读MySQL参考手册并阅读Paul DuBios的《MySQL》一书。(已有中文版-译注)
多用EXPLAIN SELECT、SHOW VARIABLES、SHOW STATUS和SHOW PROCESSLIST。
了解查询优化器的工作原理。
优化表的格式。
维护你的表(myisamchk、CHECK TABLE、 OPTIMIZE TABLE)
使用MySQL的扩展功能以让一切快速完成。
如果你注意到了你将在很多场合需要某些函数,编写MySQL UDF函数。
不要使用表级或列级的GRANT,除非你确实需要。
购买MySQL技术支持以帮助你解决问题:)
--------------------------------------------------------------------------------
十、编译和安装MySQL
通过位你的系统挑选可能最好的
less /var/run/dmesg.boot
humen1 Tech
测试脚本index.php内容为:
phpinfo();
?>;
用10000个连接,200个并发连接测试:
ab -n 10000 -c 200 http://localhost/index.php
humen1 Tech
ports安装好的mysql的root用户密码为空
这个时候
#mysqladmin -u root -p password mypasswd
这样你的密码就变成_mypasswd_ 了
humen1 Tech
#vi /etc/hosts 修改主机名
#vi /etc/sysconfig/network,修改HOSTNAME一行为"HOSTNAME=主机名"(没有这行?那就添加这一行吧),然后运行命令" hostname 主机名"。
reboot
humen1 Tech
修改gateway.php里边的
$gateway->setCharsetHandler(“utf8_decode”, “ISO-8859-1”, “ISO-8859-1”);
为
$gateway->setCharsetHandler( “mbstring”, “gb2312”, “gb2312” );
humen1 Tech
1. Samba 安装
-----------------
Samba有二进制安装的版本, 也有源代码安装版本. 我用的系统是FreeBSD,
Samba的二进制安装并不支持FreeBSD. 所以, 我就选择了源代码安装方式.
我使用的samba版本是 samba-3.0.21a.tar.gz
shell> tar zxvf samba-3.0.21a.tar.gz
shell> cd samba-3.0.21a/source
shell> ./configure
shell> make
shell> make install
shell> cp …/examples/smb.conf.default /usr/local/samba/lib/smb.conf
2. 创建用户
-------------
这里我不得不说一句,目前我还没看到网上有任何一篇文章仔细地解释samba的用户关系问题!
不厚道啊~~ 我是摸索了好久才得出以下认识的:
(1)samba用户管理使用smbpasswd和pdbedit命令
(2)samba认证使用的用户和组首先要在本地系统中存在
(3)samba只存储独立于本地系统的用户和口令信息,组则使用本地系统的组信息
首先在本地系统中创建用户user1和user2, 创建组group1和group2, user1属于group1,
user2属于group2.
然后再创建samba用户:
shell> /usr/local/samba/bin/smbpasswd -a user1
New SMB password:
Retype new SMB password:
shell> /usr/local/samba/bin/smbpasswd -a user2
New SMB password:
Retype new SMB password:
如果失败,则可能是本地系统没有事先建立同名帐号.
可以使用pdbedit -L列出现有samba用户清单, 如果清单中有新加入的用户名, 则说明用户
创建成功.
3. 配置Samba
-----------------
shell> vi /usr/local/samba/lib/smb.conf
下面是我实际搭建环境中的一个实例:
-----------------------------------
# Samba config file created using SWAT
# from 10.217.15.133 (10.217.15.133)
# Date: 2006/01/05 09:42:54
[global]
workgroup = MYGROUP
netbios name = SINA-NFS
server string = Sina NFS
log file = /usr/local/samba/var/log-%M-%I
max log size = 50
load printers = No
dns proxy = No
[it]
path = /data1/it
valid users = @group1, @group2
read list = @group1, @group2
write list = @group1, @group2
[driver]
path = /data2/driver
write list = @group1
guest ok = Yes
[software]
path = /data2/software
write list = @group1
guest ok = Yes
[patch]
path = /data2/patch
write list = @group1
guest ok = Yes
以上是通过SWAT配置后生成的最终配置文件,但实际上我手工配置时还在global部分加入了:
security = user
encrypt passwords = yes
smb passwd file = /usr/local/samba/private/smbpasswd
那上面配置要实现的目的是:
(1)所有用户都可以看到(browseable)共享目录it,driver,software,patch;
(2)group1的用户对共享目录it,driver,software,patch有读写权限;
(3)group2的用户对共享目录it有读写权限,对共享目录driver,software,patch只读;
(4)非group1和group2的用户对共享目录driver,software,patch只读,对共享目录it无读写权限;
4.设置共享目录权限
---------------------
shell> chmod -R 0777 /data1/it
shell> chmod -R 0777 /data2/driver
shell> chmod -R 0777 /data2/patch
shell> chmod -R 0777 /data2/software
5.启动samba
---------------
/usr/local/samba/sbin/smbd -D &
/usr/local/samba/sbin/nmbd -D &
6.自动运行samba
------------------
有两种方法:
(1)在/etc/rc.local加入以下内容:
/usr/local/samba/sbin/smbd -D &
/usr/local/samba/sbin/nmbd -D &
(2)在/etc/inetd.conf中加入以下内容:
netbios-ssn stream tcp nowait root /usr/local/samba/sbin/smbd -D smbd
netbios-ns dgram udp wait root /usr/local/samba/sbin/nmbd -D nmbd
swat stream tcp nowait/400 root /usr/local/samba/sbin/swat swat
第二种方法要保证inetd正常运行.
7.SWAT管理
-------------
默认情况下SWAT已被安装.
我试过通过执行/usr/local/samba/sbin/swat启动SWAT没有成功, 只有通过inetd.conf才可以成功启动.
启动成功后可以通过http://samba_server_ip:901/访问SWAT管理页面.
默认情况, SWAT使用本地系统的root用户作为管理帐号. 注意, 是系统用户, 不是samba的共享用户.
8.检查服务是否正常
---------------------
通过netstat -an看到服务端口已处理监听状态:
tcp4 0 0 *.901 . LISTEN
tcp4 0 0 *.139 . LISTEN
udp4 0 0 10.0.0.38.138 .
udp4 0 0 10.0.0.38.137 .
udp4 0 0 *.138 .
udp4 0 0 *.137 .
9.小技巧
-------------
(1)如何在一个共享目录中嵌入其它目录
有时我们需要使用多块磁盘, 那经常变更目录或更换磁盘非常麻烦, 我还不了解在samba中如何
使用多个磁盘支持同一共享目录. 所以, 我使用的方法是:
在已有共享目录中建立一个到其它磁盘的链接.
假设我要在共享目录it下建立一个到磁盘/data3上的目录iso的链接, 那么需要进行以下操作:
shell> cd /data1/it
shell> ln -s /data3/iso iso
shell> chmod -R 0777 /data3/iso
humen1 Tech
SSH提供了一些命令和shell用来登录远程服务器。在默认情况下它不允许你拷贝文件,但是还是提供了一个"scp"命令。上传:scp 源文件 用户名@主机:目的文件名。scp -r 原文件夹 用户名@主机:目的文件夹。下载:scp 用户名@主机:/path/文件名 /path/文件名。
humen1 Tech