对MYSQL进行全文检索的PHP类库
正在研究中,如果要看这个程序的详细说明和演示,请到这个地方看,真的很爽: http://steven.haryan.to/php/KwIndex.html 注意,只能在linux,unix下用。
正在研究中,如果要看这个程序的详细说明和演示,请到这个地方看,真的很爽: http://steven.haryan.to/php/KwIndex.html 注意,只能在linux,unix下用。
一般对于访问量比较大的网站来说,采用基本的MySQL Master/Slave 结构是很正常,而且一般都是一台Master,多台Slave的情况,但是一般在进行这个访问的时候问题比较多,因为读写操作必须分离,所以今天没事就构造了这个数据库操作类。 数据库操作类基本特点: 1. 支持一台Master,多台Slave的情况,所有SQL能够强制调用Master来处理 2. 能够自动识别是写入还是读取操作,然后自动连接到需要的Master/Slave服务器。 操作过程中能够自动识别,如果没有Slave,则所有操作都是指向Master的,如果当前连接的Slave无法工作则自动连接其他Slave。对于Slave读取数据采用随机挑选Slave服务器的方式来读取数据 3. 在同一个PHP程序中能够重用连接,不会重复去连接数据库,减少因为反复连接带来的资源消耗 缺点: 1. 对于Slave是采取随机选择Slave来进行读取数据,所以不是真正意义上的负载均衡 2. 每次初始化都是连接好所有的数据库,比较浪费连接资源和时间。 在多个PHP程序中无法保持数据库连接,每次启动都需要连接到远程数据库,浪费了很多连接处理的时间,但是这个跟PHP是脚本程序有关。 3. 无法支持多个Master的情况,同时可定制性比较差,很多东西都是固定的,必须按照固有模式来执行查询 相关: 代码中注释不是很全,部分注释而且不一定正确,所以如果自己使用,最好进行二次修改。 本数据库类参考了我之前写的《简单快速有趣的MySQL数据库操作类:SimpleDB》,可以对照着看。 (类库中的接口我大部分都经过了测试,都正常使用,如果发现不正常或者有更好的想法,请留言)
1st step 将Ubuntu系统更新到最新状态,在做任何操作之前都要做这一步,以确保系统的稳定,同时也不会有一些莫名其妙的现象出现。 $sudo apt-get update $sudo apt-get dist-upgrade 安装PHP支持 $sudo apt-get install libapache2-mod-php5 $sudo apt-get install php5 如果想支持图形就加php5-gd,如果想支持Mysql就加php5-mysql,这里之所以要单独列出libapache2-mod-php5,主要是由于php5的依赖关系没有做好,有可能会安装上libapache-mod-php4的包,所以为了避免不必要的麻烦,干脆还是单独指定比较好。如果有朋友还是会出现问题,请在新立得中查找libapache-mod-php4包,如果安装的话请将其删除。 修改PHP配置文件,以限制内存和文件最大上传尺寸 我们编辑/etc/php5/apache2/php.ini文件,先做一般配置,在改动之前,请先将该配置文件做个备份。以便在出错的时候可以恢复。 … memory_limit == 8M ==>修改成你所需的内存大小 upload_max_filesize == 2M ==>修改文件最大上传尺寸 … extension=mysql.so 支持Mysql服务 extension=gd.so 支持gd函数 … 其实在Ubuntu下,如果你安装了php5-mysql和php5-gd之后,会自动修改以上二行的,我们做的只不过是确认一下它们前面的注释符是否去掉。 a. 目前大多数php的open source都是用php4写的,为了兼容以前的php版本,有时需要将register_long_arrays打开,否则$HTTP_GET_VARS和$HTTP_POST_VARS等变量将无法使用,会出现一些莫名其妙的问题。 a. 另外,在装完php5后最好确认一下/etc/apache2/mods-enabled/下是否有链接: php5.load -> /etc/apache2/mods-available/php5.load 加固PHP,以增强安全性。注意,下面的安全性要因情况而定,所以我已经把它们的功能写清楚了,如果有问题的话,看看是否由于下面哪种限制条件所造成,可相应将其注释掉。那么让我们开始吧,我们将再次编辑/etc/php5/apache2/php.ini文件,之所以没有一次改完,主要是为了给大家一个清晰的思路。 #打开安全模式,打开他的好处就是PHP文件只能访问所有者和PHP文件所有着一样的文件,即使在chroot环境下也无法访问jail 中属主不一样的文件,类似于php shell这样的后门就没用武之地了哦,phpshell是很流行的php后门,他可以执行系统命令,就象他的名字一样,和shell很接近。 safe_mode = On #清注意,安全模式打开一个会导致judge online一类有调用外部程序的php无法工作。 #下面的设置就限制了fopen(), [...]
一、编码范围 1. GBK (GB2312/GB18030) \x00-\xff GBK双字节编码范围 \x20-\x7f ASCII \xa1-\xff 中文 \x80-\xff 中文 2. UTF-8 (Unicode) \u4e00-\u9fa5 (中文) \x3130-\x318F (韩文 \xAC00-\xD7A3 (韩文) \u0800-\u4e00 (日文) ps: 韩文是大于[\u9fa5]的字符 正则例子: preg_replace(“/([\x80-\xff])/”,””,$str); preg_replace(“/([u4e00-u9fa5])/”,””,$str); 二、代码例子
1.先安装LAMP环境 apache2.2-common PHP5 php5-mysql 请参考此文:http://tienet.blogspot.com/2008/12/ubuntuphp.html 2.安装以下必须的包 autoconf automake libtool m4 php5-dev make 3. 下载eAccelerator 去eAccelerator官方网站http://eaccelerator.net/下载最新版本的ea, 这里下载的是eaccelerator-0.9.5.3这个版本。 4. 编译安装eAccelerator 解压下载下来的包,并在终端下转到解压后的目录, 接下来执行: export PHP_PREFIX=”/usr” sudo $PHP_PREFIX/bin/phpize ./configure \ –enable-eaccelerator=shared \ –with-php-config=$PHP_PREFIX/bin/php-config sudo make sudo make install 到此,安装完成! 5. 配置php.ini文件 /etc/php5/apache2/php.ini 在php.ini文件里加入: zend_extension=”/usr/lib/php5/20060613+lfs/eaccelerator.so”(20060613
1.本机执行php 1.1 安装完php后可以直接执行php脚本。如安装到“C:\Program Files\PHP” 1.2 若环境变量path加上了“C:\Program Files\PHP”目录,那在命令行直接打php即可运行。 1.3 方式一:在命令行直接执行“php”,然后输入 < ?php echo "Hello World"; ?> Ctrl+Z 回车 执行后回显“Hello World”。 1.4 方式二:编写php文件,如“a.php”,内容为 < ?php echo phpinfo(); ?> 保存后在命令行执行 php a.php,会显示php全部情况包括加载模块等。 1.5 方式三:在命令行执行简单代码。 php -r “echo ‘Hello World’;” 执行后会显示“Hello World”。注意代码要用引号括起来,代码里的引号和外面的引号不要有冲突。 1.6 在什么情况下要用php命令行(即CLI): 1.6.1 定时调用php程序。 1.6.2 其他应用程序如java等使用命令行调用php程序。 1.6.3 编辑工具命令行运行或调试。 1.6.4 查看php版本、环境、源码和其他信息。 1.7 php命令行常用的 1.7.1 php -h php命令行帮助,php命令行的老师 1.7.2 [...]
wiki系统不能发送确认邮件,请检查您的邮箱地址是否包含非法字符。 邮件传送员回应:It is not safe to rely on the system’s timezone settings. Please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected ‘UTC’ for ’8.0/no DST’ [...]
来源:zhoz 上午终于把IF接口设计好了,加密与解密认证通过客户认定。主要通过三个参数来识别验证。 下面将用到向远程服务器提交参数,并获取结果来处理。
想提供下载但又不想放出指定文件的路径。通常通过php读取文件生成网络流,再输出到页面即产生下载响应。 主要函数:fread(PHP 3, PHP 4, PHP 5) fread — 读取文件(可安全用于二进制文件) 说明 string fread ( int handle, int length ) fread() 从文件指针 handle 读取最多 length 个字节。该函数在读取完 length 个字节数,或到达 EOF 的时候,或(对于网络流)当一个包可用时就会停止读取文件,视乎先碰到哪种情况。 注: 如果只是想将一个文件的内容读入到一个字符串中,用 file_get_contents(),它的性能比上面的代码好得多。
通常截取字符,主要分为英、数字/中文,就中文来说长度是不一定的,如用strlen输出就会发现,通常一个假名/汉字长度有的是3位,也有2位的情况。这样就不能直接用SubStr来截取,否则可能会出现截取不全的乱码现象。 这里介绍SubStr和新主角mb_substr来处理上面的情况。 通常英文、数字直接就用SubStr没什么说明了。 $monji = "可愛"; // 截取开始 $monji_ii = mb_substr($monji, -1, 1); // 愛 $monji_ka = mb_substr($monji, 0, 1); // 可
exec(string $command[,array &$output[,int &$return_var]]) –Execute an external program string escapeshellarg(string $arg); string escapeshellcmd(string $command); void passthru(string $command[,int &$return_va]) –Execute an external program and display raw output
很多时候,我们在网上注册个人信息,在提交完页面后,总得等待页面刷新来告诉我们注册是否成功,遇到网络差的时候,如果注册了一大串的东西,在经过漫长的 等待页面刷新后,得到的确是“您的用户名已被使用”或XXXXXXX不合法,我想大家的心情一定特别不爽,今天就介绍个AJAX实现页面不刷新注册+实时 检测用户信息的简单注册程序,希望对大家有所帮助。好的,先看注册界面代码:
PHP 尽管提供了大量有用的函数,但是在特殊情况下还可能需要进行扩展编程,比如大量的 PECL(PHP Extension Community Library)就是以扩展的形式提供的(动态链接库dll文件),它们比 PEAR 的运行效率要高很多。 PHP 扩展是用 C 或 C++ 编写的,需要编译成动态连接库 dll 文件后在 PHP 环境下注册后才能使用。 编写 PHP 扩展的软件要求: VC++6.0 或 VC++.NET 环境。 PHP 的源代码,需要编译。 如果不愿意编译 PHP 的源代码,可以再下载 PHP 的已经编译成功的二进制代码(就是我们部署 PHP 运行环境的那些文件包)。注意分别下载的源文件包和已编译包,它们的版本必须一致。
Ajax的原理 这个其实要从C/S和B/S的原理说起。Windows操作系统的诞生,为单机通信提供了很大的支持,程序设计也从DOS早期的单任务单用户向网络的分布式应用过度。C/S提供的客户/服务器编程模式为网络应用提供了一个有效的通信手段。浏览器与Web服务器之间的请求/ 服务,就是一个典型的C/S应用。 有人说,怎么是C/S?这应该是B/S呀!其实是这样理解的:浏览器/Web服务器作为我们实现网页发布的一个平台,对于我们在这个平台上开发的应用,我们的应用是由浏览器从Web服务器上下载下来然后展示在浏览器的“容器”里的,我们的应用是B/S模式的。但是浏览器与Web服务器的通信,却是C/S模式的。可以说,B/S模式是建立在C/S模式之上的。 Windows早期的桌面应用程序(包括单机程序和C/S结构的网络应用程序),其界面是调用Windows的API来实现的,后来,出现了VB、Delph(VCL)、VC++(MFC)等应用程序框架,把繁杂的API包装起来,使Windows程序开发难度大大降低、效率大大提高。
[文章作者:张宴 本文版本:v1.0 最后修改:2007.11.16 转载请注明出处:http://blog.s135.com] 最近遇到一个问题,Linux下的PHP命令行程序作为守护进程,需要从队列文件中读一行数据,通过TCP协议发送给外地的接收服务器,再读下一行数据,再发送。当本地与外地的网络状况不好时,有时候发送一条数据所耗费的时间就较长,累积起来容易造成队列堵塞和延迟。 于是,我准备用该PHP命令行程序生成多个子进程,将串行处理变成并行处理。最简单的方法就是在PHP中用exec()或popen()函数将一个shell命令行推到后台去执行,例如: <?php exec("/bin/sh /opt/zhangyan.sh &"); ?> 最后的&表示将shell脚本推到后台去执行。 但是这样会有一个问题,如果推到后台的进程太多,可能会导致服务器系统资源耗尽而崩溃,所以必须控制进程数量。 我写了一个PHP程序(/opt/zhangyan.php)、一个shell程序(/opt/zhangyan.sh)作为测试用例。 程序的逻辑: 1、设置/opt/zhangyan.php最多允许生成500个子进程; 2、当/opt/zhangyan.php读取到一条数据后,将允许生成的子进程数减1(空闲进程数$p_number=500-1=499),然后将数据交给/opt/zhangyan.sh去后台处理,不等待/opt/zhangyan.sh处理结束,继续读取下一条数据; 3、当允许生成的子进程数减至0时(空闲进程数$p_number=0),/opt/zhangyan.php会等待1秒钟,然后检查后台还有多少个/opt/zhangyan.sh子进程尚未处理结束; 4、如果1秒钟之后/opt/zhangyan.php发现后台的/opt/zhangyan.sh子进程数还是500(空闲进程数$p_number=0),会继续等待1秒钟,如此反复; 5、如果/opt/zhangyan.php发现后台尚未处理结束的/opt/zhangyan.sh子进程数减少到300个了(空闲进程数$p_number=500-300=200),那么/opt/zhangyan.php会再往后台推送200个/opt/zhangyan.sh子进程; /opt/zhangyan.php代码如下: view plaincopy to clipboardprint? <?php function run($input) { global $p_number; if ($p_number <= 0) { $p_number = worker_processes($p_number); } $p_number = $p_number – 1; $out = popen("/bin/sh /opt/zhangyan.sh \"{$input}\" &", "r"); [...]
1、HTTP协议本身是无状态的。 我们上网都要靠HTTP协议传递信息。比如我们在浏览器里键入:www.bokee.com这个网址并回车,你会发现网址会变成:http://www.bokee.com,其原因就是浏览的网页是基于http协议的。http协议无法记录用户经常上哪些网站,有什么爱好,也无法记录用户的ID帐号和密码。这就是所谓的HTTP协议无状态。HTTP协议本身是无状态的,这与HTTP协议本来的目的是相符的,客户端只需要简单的向服务器请求下载某些文件,无论是客户端还是服务器都没有必要纪录彼此过去的行为,每一次请求之间都是独立的,好比一个顾客和一个自动售货机或者一个普通的(非会员制)大卖场之间的关系一样,你认得它们,它们则肯定认不得你。 2、怎样理解cookie和session? 由于cookie和session关系密切,这里我们一并介绍。 打个比方:在河南时,我常到一家熟食店买馋嘴鸭,该店老板为了促进销售,特发布“每购满10只即可免费赠送一只”的优惠措施。除了家里有什么红白喜事要飨客之外,应该不会有人一次性购买10只烤鸭吧?所以老板得想个法子来记录顾客的消费数量,这里总共有三种方案:
使用 PHP V5 的新语言特性,可以明显地提高代码的可维护性和可靠性。通过阅读本文,您将了解如何利用这些新特性将用 PHP V4 开发的代码迁移到 PHP V5.
PHP5中增加了Iterator,一组有助于导航和处理等级数据结构的现成接口,这是PHP5最有趣的新特性之一。 这些Iterator显著减少了处理XML文档树或文件集合所需的代码。PHP5中使用大量Iterator,包括ArrayIterator、 CachingIterator、LimitIterator、RecursiveIterator、SimpleXMLIterator和 DirectoryIterator。 通过DirectoryIterator可以迅速有效地对目录中的文件进行处理。在编码过程中稍微增加一些创造力,DirectoryIterator还可用于递归处理嵌套式目录树。这两个任务只需使用几行代码就可以完成,比“标准”处理方法有了显著提高。 处理单级目录 首先我们从简单的任务着手:处理一个单级目录。输入(或复制)以下代码(列表A),修改目录路径以反映当地配置: 列表A <?php$it = new DirectoryIterator(“/tmp/mystuff”);foreach($it as $file) {if (!$it->isDot()) {echo $file . “n”;}}?>在浏览器中查看这段代码的输出结果,你会在指定目录中看到一个文件列表。这一切是如何发生的呢?DirectoryIterator提供一个预先确 定的接口来重述一个目录的内容;示例目标目录的位置后,就可以把它当作一个标准的PHP数组来处理,每个元素代表目录中的一个文件。注意它使用isDot ()方法分别过滤掉“.”和“..”目录。 处理嵌套式目录树 递归处理一个嵌套式目录树几乎同样简单。在这种情况下,DirectoryIterator需要检查它在单级目录中遇到的每一个对象,确定其是一个文件还是目录。如果是一个目录,就更深入一级检验下一级的内容。这听起来似乎相当复杂,在过去一般都需要15行以上的代码。 但是,使用PHP5,你只需要两个新的Iterator:RecursiveIterator和RecursiveIteratorIterator,它们组合了所有上述功能。见列表B: 列表B <?php$it = new RecursiveDirectoryIterator(“/tmp”);foreach(new RecursiveIteratorIterator($it) as $file) {echo $file . “n”;}?>这时,输入结果将列出起始目录下的所有文件和目录。不必说,如果需要处理某个特定目录级下的所有文件——例如,递归压缩一个目录树;或修改一系列嵌套文件的组/所有者许可时——使用这种递归内置接口就非常方便。 现实应用:打印一个目录树 打印图形目录树是目录递归的一个常见应用。利用Iterator处理这个任务十分简单,因为Iterator类文档中包含一个专门为这个应用而编写 的实例类。DirectoryTreeIterator(感谢Marcus Boerger)为前面讨论的RecursiveIteratorIterator提供了其它改进,特别是在树结构中代表深度和位置的ASCII标记。 列表C说明了DirectoryTreeIterator的用法。 列表C <?php$it = new DirectoryTreeIterator(“/tmp/cookbook/”);foreach($it as $path) {echo $path . “n”;}?>以下是你看到的一部分输出结果: |-ch01| [...]
一个滚动字幕。要求用php生成gif图片。所以上网找了GIFEncoder这个类库。确实很好用,但是,应用过程中也出现了一些小问题,现在放在这里,以供参考,少走弯路。 <?php Class GIFEncoder { var $GIF = “GIF89a”; /* GIF header 6 bytes */ var $VER = “GIFEncoder V2.06″; /* Encoder version */ var $BUF = Array ( ); var $LOP = 0; var $DIS = 2; var $COL = -1; var $IMG = -1; var $ERR = Array ( ‘ERR00′ =>”Does not supported [...]
在 使用syslog-ng搭建日志服务器 中已经讲了如何将syslog-ng配置为中心日志服务器,下面介绍如何将syslogng的日志写入mysql数据库, 系统:Gentoo-2007 1、修改/etc/syslog-ng/syslog-ng.conf,添加 source s_remote { udp(ip(0.0.0.0) port(514)); }; destination r_mysql { program(“/usr/bin/mysql -usyslogadmin -psyslogadmin syslog log { source(s_remote); destination(r_mysql); }; 2、建立mysql.pipe文件按 #mkfifo /var/log/mysql.pipe 3、重新启动syslog-ng #/etc/init.d/syslog-ng restart 这种方法如果结合phpsyslogng一起使用,就可以在浏览器中对日志进行进一步的过滤和查看,非常方便,官方网站地址是: http://code.google.com/p/php-syslog-ng/ http://nms.gdd.net/index.php/PHP-Syslog-NG
在本系列文章告一段落的时候,我们看到的是PHP的局限性。热爱PHP的人们可能会对此觉得沮丧。但是,这并无损于PHP作为一门优秀语言的声誉。尺有所短,寸有所长,对于我们熟悉和喜爱的工具,我们更应该了解它们的局限,这也有利于我们更有效地使用它们。
来源地址: http://www.williamlong.info/info/archives/189.html 当我们使用下面的PHP语句发送中文电子邮件的时候,会发现邮件的标题是乱码,而邮件正文却是正确的,如何才能使得邮件标题不是乱码呢? $subject = stripslashes($the_post['Title']); $headers = “MIME-Version: 1.0\r\n”; $headers .= “Content-type: text/plain; charset=utf-8\r\n”; $headers .= “Content-Transfer-Encoding: 8bit\r\n”; $message = stripslashes(strip_tags($the_post['Content'])); mail($to, $subject, $message, $headers); 先用函数base64_encode() — 使用 MIME base64 对数据进行编码 标题字符串前加编码类型例如: =?UTF-8?B? 标题字符串后加:?= 例如: $subject = “=?UTF-8?B?”.base64_encode($subject).”?=”; 将上面一句添加到代码之中,这样,发送的中文邮件标题就不是乱码了。
有的时候PHP连接mysql数据库里网页会出现乱码情况,一般的MySQL 字符集: UTF-8 Unicode (utf8),MySQL 连接校对相应的也就是utf8_general_ci,网站使用utf8编码的好处也就是不管世界各地的人谁访问网站,一般都不会出现乱码的情况,但如果在phpmyadmin上面新建数据库的时候没有选择utf8_general_ci,数据库默认是latin1_swedish_ci,所以在首先在phpmyadmin里面看到的中文录入信息就是乱码,所以一定要把数据库的信息默认改成utf8_general_ci,当php连接的时候,可以在数据库连接文件里设定总的网页默认语言, mysql_query(“set names ‘utf8′”),也可以在分页里设置mysql_query(“set names ‘utf8′”),但必须是在数据库连接后使用,$conn = mysql_connect(“localhost”,”root”,””);mysql_query(“set names ‘utf8″);//这就是指定数据库字符集,一般放在连接数据库后面就可以了。 页面申明编码:在HTML代码HEAD里面,可以用<meta http-equiv=”Content-Type” content=”text/html; charset=”XXX” />来告诉浏览器网页采用了什么编码,目前中文网站开发中主要用的是GB2312和UTF-8两种编码。
class TestMagicFun{ public $name = ”; public $email = ”; } $testObj = new TestMagicFun(); $testObj->name = ‘simple’; $testObj->email = ‘abc@gmail.com’; $testObj->address = ‘earth china’; 下面的代码在php4,php5中运行都无问题,而在实际的工作中,我们可能不想使用者对未声明的属性进行赋值,此时PHP4就无能为力了,还好在PHP5中有__set(),__get()这样的魔法方法可以用。 我们可以对上面的类进行一下改造 class TestMagicFun{ public $name = ”; public $email = ”; private function __set($property,$value) { // 在此处做一些特殊的处理 print “not defined {$property}”; } private function __get($property) { // 在此处做一些特殊的处理 print “not defined {$property}”; } } 然后再初始化一个对像 $testObj = new TestMagicFun(); $testObj->name = ‘simple’; $testObj->email = ‘abc@gmail.com’; $testObj->address = ‘earth china’;
![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ||||||||||