php不同的函数对目录的起始点判断或不相同

比如,php的文件系统函数(如file_get_contents)打开文件时默认查找文件的位置,和包含函数(如include、require)包含文件时查找的位置是不一样的。

例如文件目录结构为:
/index.php
/functions.php
/inc
/inc/init.php
/inc/functions.php

在/blog/index.php包含了init.php,在init.php中存在如下代码:

file_get_contents(‘functions.php’);
include(‘functions.php’);

file_get_contents函数会在主执行文件(即/index.php)所在的目录(即/)中搜寻,找到/functions.php文件,而include函数却会在被包含文件(即/inc/init.php)所在的目录(即/inc)中搜寻,找到/inc/functions.php文件。

但是,如果改成:

file_get_contents(‘./functions.php’);
include(‘./functions.php’);

它们的搜寻目录就一致了,都是在主执行文件所在目录(即/)进行搜寻,找到文件/functions.php。这是因为相对目录符号”.”,是以主执行文件的目录为参照对象的。

使用Yii进行PHP的命令行程序(Console command)开发

PHP提供的cli模式可以进行一些简单的shell程序开发,Yii框架也提供了cli程序开发的解决方案。

在Yii项目的protected目录下,存在yiic和yii.bat两个文件,它们分别是类unix系统和windows系统下执行Yii项目的命令行程序的入口,例如:

或者

具体使用哪种写法,取决于入口程序是否有执行权限,例如,在linux系统下,如果执行命令:

给予了yiic执行权限,就可以用第一种方式来执行php命令行程序,否则需要使用第二种方式。 Read the rest of this entry »

PHP的cli命令行模式编程

PHP提供了命令行模式的开发方法:cli,它可以用PHP来开发可以在命令行环境下执行的shell程序。
PHP的cli模式有以下特点:
PHP不会输出http头信息,因为命令行模式下这些信息是无意义的。
自动覆盖了php.ini某些设置,如:

  • html_errors=FALSE \\设为true,返回的错误信息中可以附带链接指向提供更详细错误描述的相关页面,显然这个特性在命令行下是无意义的。
  • implicit_flush=TRUE \\立即将输出内容发送到终端,不做任何缓冲,当然如果想使用输出缓冲功能,依然可以使用相关函数来设置。
  • max_execution_time=0 \\程序最大执行时间设置为无限。
  • register_argc_argv=TRUE \\决定PHP是否定义$argv和$argc两个全局变量,默认是false。在web环境下这个设置起作用的前提是register_globals=on。另外还可以用$_SERVER['argv']来访问他们,具体细节如何有待验证。 Read the rest of this entry »

Mysql全文搜索match…against的用法

前提:mysql只支持英文内容的全文索引,所以只考虑英文的全文搜索。假定数据表名为post,有三列:id、title、content。id是自增长序号,title是varchar,content是text,给content添加全文索引。

mysql全文搜索有三种模式:

一、自然语言查找。这是mysql默认的全文搜索方式,sql示例:
[code=plain]

select  id,title FROM post WHERE MATCH(content) AGAINST ('search keyword')

或者显式声明使用自然语言搜索方式 Read the rest of this entry »

sqlite正则表达式的用法与用户自定义函数


想用sql语句以正则匹配的方式从sqlite数据库中获取我想要的一组数据,语句如下:
[code=plain]

SELECT id,word FROM words WHERE word REGEXP "^[a-zA-Z]+$" LIMIT 10

Mysql中无误执行的SQL语句,在sqlite数据库却回报了错误:

REGEXP函数不存在?

可Sqlite文档中分明存在着关于REGEXP的说明,不过这段英文说明与其他关键字的说明有一些不同,我一时没有理解它所表达的意思。通过搜索引擎大神,才明白,原来Sqlite这个迷你数据库系统并没有内置实现正则表达式的功能,只是提供了一个REGEXP的关键字,这个关键字实际上是一个需要用户自行编写的自定义函数,譬如我现在用PHP和Sqlite结合开发,那就需要编写一个PHP的函数供Sqlite调用,譬如: Read the rest of this entry »

用web版SqliteManager不能查看存储了utf8中文内容的sqlite数据表的问题

最近在用sqlite做一些小东西,所以需要找个好用的sqlite管理工具,桌面版的找了一堆,比如sqlite spy、sqlite admin、sqlite developer等等,这些桌面软件要么缺少中文版、要么功能太简陋、要么操作很别扭,总之我都不满意,虽然之前在firefox下用过一个用于sqlite管理的插件,各方面都还过得去,可我现在主要使用chrome浏览器,不可能为了管理sqlite特意再开个firefox。绕了一圈我又重新拿起了原本用过的PHP版的SqliteManager(还有款桌面工具也叫这个名字,不过它们的雷同实属巧合),它和所有PHP人都熟悉的PHPMyAdmin非常类似,不需要浪费你哪怕一分钟的时间去上手,打开就会用,也有多语言支持——看来还是PHP人最了解PHP人需要什么样的工具啊。

然而使用SqliteManager时我遇到了一个不大不小的问题:将utf-8编码的内容存入sqlite后,SqliteManager却浏览不到数据;存入英文或gb2312编码的内容就可以浏览。我一度以为sqlite对utf8编码的处理有什么特殊之处,可从未听到类似的说法。我用PHP再将存入的UTF8数据读取后输出,嘿,这数据分明好好的存在sqlite之中了。再看看SqliteManager的网页源码,真相大白,原来选择了SqliteManager的界面语言为简体中文时,网页编码就是gb2312,当然不能显示utf8的内容了。 Read the rest of this entry »

[翻译]如何让Yii框架支持多个数据库

原文:http://www.yiiframework.com/wiki/123/multiple-database-support-in-yii

在Yii应用的配置文件 protected/config/main.php 中通常只有一个数据库配置段落,不过要让它支持多个数据库,并且让不同的Model绑定到不同的数据库也很简单的。

我们将在官方blog示例程序上增加一个独立的广告数据库,虽然广告数据库和博客是关联的,但它仍然是一个独立的系统。

建立配置 

首先在配置文件的第一个数据库配置段落之后增加一个新的数据库段落,当然你可以把它叫做db2,但是为了可读性我们把它命名为 dbadvert。 Read the rest of this entry »

用chroutes来自动判断是否需要使用VPN翻墙

最近开始尝试VPN来翻墙,VPN不是普通的代理服务,一旦建立连接,VPN会接管你电脑的网络连接,一切互联网操作都要通过VPN进行,Firefox的autoproxy没有用武之地,翻和不翻需要通过连接或断开VPN来实现,灰常麻烦。幸好,勤劳智慧的屁民们蛋疼的力量是无穷的,早已有人给出了相应的解决方案——chnroutes。顾名思义,这是专给天朝屁民准备的路由方案,它把墙内和墙外IP段区别开来,对墙内访问目标使用本地网络路由,对墙外访问目标使用VPN路由。

简记在windows上使用pptp的VPN时使用方法如下:

    在chnroutes的下载页面下载pre_created_for_win.zip文件包,这个文件包有四个文件,在建立VPN连接下,运行vpnup.bat,此批处理文件会自动修改你的路由设置,对墙里墙外IP区别对待,然后建立VPN连接,您的无缝穿墙术就修炼成功了。当你断开VPN时,可以再执行vpndown.bat批处理命令恢复你电脑的路由设置。

用SolusVM提供的API让我用烂手机wap功能管理VPS

最近三天我在yardvps购买的百元VPS很不给力,每天下午6点-8点我都收到了监控宝的免费短信告警。偏偏这段时间正是我下班回家吃饭看电视的时间,害我急忙忙地——跑回家或者放下碗——去开电脑,结果都是VPS自动offline了,我在管理面板里重新启动一下即恢复正常,虽然不是需要我用蹩脚鸟语联系洋鬼子的严重故障,但天天如此让我不胜其烦。

想起在论坛上看到某高人说,他管理VPS在手机上点一下就OK,如果我也能用手机来重启VPS那就方便了,不论时间场合随时都能解决类似故障。毛主席教导我们,自己动手,丰衣足食,我决定贯彻毛主席的指示,DIY一个用手机来重启VPS的功能。 Read the rest of this entry »

让你的监控宝拥有免费的无限短信通知

现在菜刀网志迁移到了新入手的VPS上,花费还不足百元,比起之前在ixwebhosting上时无论访问速度还是稳定性都有了极大提高,远超我的期望。然而毕竟是白菜价产品,时不时地还会出些故障,有时候VPS会莫名其妙的offline,需要去控制面板里boot才能恢复。这时候使用网站监控服务就很必要了。

说起网站监控,我推荐监控宝,从它刚上线时我就注册了使用它的免费监控服务,当网站出现访问故障时,它可以自动发送通知邮件,平时来讲已经很够我用了。但在春节前我烦恼了,回到老家就不能随时上网,一旦服务器发生故障时就不能及时知道——当然,监控宝有短信通知服务,但那是付费服务,需要购买短信配额,虽然只是几十块钱,对我这种芝麻绿豆站来说实在不值当。

怎么办呢?我想到了前段时候注册了中国移动的139邮箱,因为是中国移动自家的娃娃,该邮箱就有了个来信短信通知的免费功能!那么如果我把监控宝接收邮件通知的邮箱改成和我手机号码绑定的139邮箱,岂不是等于我拥有了个监控宝无限短信通知服务?

偶买高,我真有才!