膘叔 简单人生
继续几点注意事项
命令行和WEB运行程序中遇到的问题就是,这两个方式生成的图片目录权限不一样,目录命令行,如果以xxx用户登录,生成的目录组就是xxx,而WEB因为指定了apache或者nginx的用户组(如:www-data),生成出来的权限就是以www-data为主,如果需要读取和处理Xxx目录下的图片等,很可能会遇到不能读取或者没有权限的问题
因此,一个办法是:su www -c 'xxxx'这种指定权限的方式来处理
还有一个办法:
suPHP is a tool for executing PHP scripts with the permissions of their owners. It consists of an Apache module (mod_suphp) and a setuid root binary (suphp)
嗯看一下:suPHP
现在就可以了?但总是不爽。没有什么更好的办法 .。。
怎样刷新页面
看这个标题,或许很多人会嘲笑我,刷新,谁不会呀。F5一按就完事了呗。
大家都知道刷新分:普通刷新和强制刷新,普通刷新的话,如果图片做了缓存(304)那么几乎是永远都看不到新图了。做开发的,当然希望是每次都强制刷新,可以看到真实的效果,不过。。。。万一用户没强刷怎么办。
看了一下taobao QA的文章才了解,刷新的种类居然有这么多:
- 浏览器的刷新有2类
- 第1类:普通刷新。会首先从缓存中加载内容,缓存中已过期部分内容会从服务器重新请求。
- 第2类:强制刷新(刷新缓存和页面)。会从服务器重新请求所需要加载的内容
- 第2类刷新的情况:
- 1) 快捷键CTRL + F5
- 2) 按键CTRL + 点击工具栏刷新按钮
- 3) 按键CTRL + 点击地址栏右侧刷新按钮
- 第1类刷新的情况:
- 1) 点击工具栏刷新按钮
- 2) 点击地址栏右侧刷新按钮
- 3) 网页中右键菜单,点击刷新按钮
- 4) 菜单:查看->重新载入
- 5) 快捷键F5
- 6) 快捷键SHIFT + F5
- 7) 通过鼠标手势刷新
- 8) 按键CTRL + 网页中右键菜单,点击刷新按钮
- 9) 按键CTRL + 菜单:查看->重新载入
- 10) Webkit核下,快捷键CTRL + R
mac下面,几乎就是接ctrl换成command。
Firefox,如果安装了firebug,打开firebug,在net标签中可以选择:强制刷新,这样每次请求都不会从缓存中走了。
开发中的几件事
开发中又遇到一些事情,于是记录一下
1、CURL的问题
curl在安全模式下或者设定了open_basedir的情况下,如果使用了OPT_FOLLOWLOCATION,会导致无返回值。这个理由很多,但FOLLOWLOCATION这个参数是用于目标网址会多次跳转而使用,还可以设置最大跳转次数,因此,如果你要抓取的对象有多次跳转,这个参数就非设不可(真纠结,实在不行就file_get_contents了,它自动支持多次跳转,但不如curl更可控一些)
具体关于CURL的一些常用参数,可以看这里:
- curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
- //HTTP协议的版本号
- curl_setopt($ch, CURLOPT_NOPROGRESS, 1);
- //如果你不会PHP为CURL传输显示一个进程条,设置这个选项为一个非零值。注意:PHP自动设置这个选项为非零值,你应该仅仅为了调试的目的来改变这个选项。
- curl_setopt($ch, CURLOPT_NOBODY, 0);
- //如果你不想在输出中包含body部分,设置这个选项为一个非零值。
- curl_setopt($ch, CURLOPT_HTTPGET, 1);
- //设置HTTP请求的方法为GET
- curl_setopt($ch, CURLOPT_ENCODING, ”);
- //设置HTTP请求头中可接受的压缩格式
- curl_setopt($ch, CURLOPT_COOKIEFILE, 1);
- //传递一个包含cookie数据的文件的名字的字符串。这个cookie文件可以是Netscape格式,或是堆存在文件中的HTTP风格的头。
- curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
- //设置这个选项为一个非零值(象 “Location: “)的头,服务器会把它当做HTTP头的一部分发送(注意这是递归的,PHP将发送形如 “Location: “的头)。
- curl_setopt($ch, CURLOPT_MAXREDIRS, 3);
- //最多可以进行几次HTTP重定向,一般和curl_followlocation联用
- curl_setopt($ch, CURLOPT_USERAGENT, ‘Mozilla/4.0 (compatible; MSIE 5.00; Windows 98)’);
- //在HTTP请求中包含一个”user-agent”头的字符串
- $http_header = array();
- $http_header[] = ‘Connection: Keep-Alive’;
- $http_header[] = ‘Pragma: no-cache’;
- $http_header[] = ‘Cache-Control: no-cache’;
- $http_header[] = ‘Accept: */*’;
- $http_header[] = ‘Host: ‘.$url_ary['host'];
- curl_setopt($ch, CURLOPT_HTTPHEADER, $http_header);
- //一个数组格式的HTTP头文件格式
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- //将curl_exec的返回值转换成一个字符串,而不是直接输出出来
- curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
- //设置一个长整形数,作为最大延续多少秒
- curl_setopt($ch, CURLOPT_REFERER, $url);
- //在HTTP请求中包含一个”referer”头的字符串
- curl_setopt($ch, CURLOPT_URL, $url);
- //这是你想用PHP取回的URL地址。你也可以在用curl_init()函数初始化时设置这个选项
2、命令下行指定用户组来执行命令
最偷懒的方法就是:su www -c 'php xxx.php'
3、hightman遇到的Javascript函数parseInt(''),返回NaN,这个让我想起有个人做了一个PPT,来说明JS中的一些特殊问题,它的地址是:http://neatstudio.com/show-1987-1.shtml
4、PHP的header跳转
大家都知道header("Location:http://xxx.xxx.com");在这个之后如果你file_put_contents内容去一个文件,还是会被执行的,于是我们习惯性的在header跳转后继续处理一些内容,即不影响跳转,也可以完成一些内容性的处理。
但尝试了一下,如果是header()下面跟上sleep(10);你会发现header不会即刻跳转了,会等10秒后再跳转。
因此,现在了解header跳转还是会受原有代码的影响的。
5、HTML5的a标签属性ping
ping的属性说的很好,当a有href属性时,如果有ping属性,会在跳转链接时候,自动ping网站(ping标签中的对应网站),但测试了一下之后发现。居然没用。查看了一下资料,我操:
- The ping attribute has been removed from the W3C version of HTML5.
我郁闷啊。。。
-------EOF------
开发中的一些注意事项
开发中遇到一些问题,值得记住,所以我记录了一下
1、在项目中为了取得泛域名的前缀网址,这个前缀是指定的a,b,c三种,如果前缀不在这三种之内,默认为a,在apache下面的时候,建了一个*.test.neatstudio.com的泛域名指到vhost中。然后用偷懒的方法list(explode(".",$_SERVER['SERVER_NAME']))就取到了a,b,c,因为在apapche中,$_SERVER['SERVER_NAME']就是实际的a.test.neatstudio.com。然而到了nginx下行不通了。在nginx下,$_SERVER['SERVER_NAME']居然还是test.neatstudio.com,最后打印$_SERVER变量,发现$_SERVER['SERVER_HOST']才是泛域名的a.test.neatstudio.com。在此做一个记录
2、chown处理大量小文件时,你就等着CPU标高100%吧。这个问题很痛苦,但没办法
3、我晶。我记得要写一个很重要的笔记 的。我TMD又忘了。被第一个问题打断了。我晶啊,算了。等想起来再说吧
Yii框架中设置时区
时区这东西,在开发的时候,你说重要吧,也还好,毕竟没它也能正常运行,你说不重要吧,那就纠结了。特别是linux系统,都TMD差上几小时,你能不痛苦吗?win还好一点。
有一些常规方法,是大家目前都在采用的
1、php.ini中的设置,这个就不谈了,
2、程序中公用文件里设置,date_default_timezone_set一下时区
3、或者。。。自己写时间处理函数,在遇到时间的时候,用这个函数处理(比较偏向于使用这种方式,如果你的用户来自于五湖四海,或许就有用了)
4、yii框架中,可以直接在/protected/config/main.php中加入timeZone,即可
折腾ACE
折腾完后yiiforsae后又开始折腾yiiforACE了,只是ACE相对还是比较痛苦的。毕竟ACE的出错直接就提示一句:
XML/HTML代码- The page you are looking for is temporarily unavailable.
- Please try again later.
然后什么信息都没有了,根本 没有办法定位程序错在哪里。这让我很是纠结,但没有办法,一点点的来吧,感觉ACE的速度挺快。而且有1G的数据库。256M的memcache。只是rewrite怎么办呢?
苦
Yii的AR效率释疑
关于yii的AR效率,其实一直以来都有很多的想法,试想,如果不做metadata的缓存,每次查询前,都必须先做一下metadata的查询,效率也不会太高到哪里吧?
所以,看到官方有人在问就关注了一下:http://www.yiiframework.com/forum/index.php/topic/16597-yii%E7%9A%84ar%E7%9C%9F%E7%9A%84%E8%83%BD%E7%94%A8%E4%B9%88%EF%BC%9F/
有人提问:
- 我在首页会很多个ar的请求。热门文章、最新文章、编辑推荐、最新评论的文章。。。。
- 我把这些通过 model()->findAll()的结果放在一个数组里。
- 然后把这个数组var_dump了一下,这些数据高达1.06M。这是不是太耗内存了?
- 页面上全是密密麻麻的数据表结构,如果关联关系复杂点的,会更多。
- 我光var_dump(yii::app()->db) 就有5000多行的数据。
- 这样的db操作这么耗内存,敢用么?谁能消除我这个担心?多谢
- AcitveRecord ,只能玩一玩开拓眼界. 真要生产环境用, 就不行!
然后,Qiang就回复了:
XML/HTML代码- 你的结论有点想当然了。建议你仔细做profiling来验证。事实上,AR已经被成功应用在若干大流量的网站上了。
- 你不能用var_dump()来估计AR的内存开销。var_dump会把所有被reference到的对象都dump出来,包括application,以及所有的application component,因为它们都被AR间接reference到了。
- AR额外的内存开销是存储10个左右变量的开销。如果按20字节来估算,额外的开销是200字节,这样在1000个AR对象情况下,额外的内存开销为200KB。这个对几乎所有的web应用而言应该不是问题。
- 如果你需要装载更多的数据,建议你使用DAO。
- 另外,对于任何大流量的web应用而言,cache都是必须的。cache可以帮助解决绝大多数的性能瓶颈。
cache在DB中有一些处理的,比如那个duration,在db中查询就可以做一下缓存了。然后metadata再做一下缓存,不也挺好?
Yii Behavior的简单用法
Yii的behavior用起来是十分方便的,官方的文档也很多,我不多嘴一一解释,我只说一些简单的用法
如果你看过PHP5.4,你应该知道5.4多了个新功能traits。
那你可以对着手册看了,你就当yii的behavior就是5.4的traits。
在任何基于CComponents类扩展的类里,都可以用attachBehavior来附加一个行为,这就象5.4的在类里面 use traits类一样
附加行为后,直接可以$this->行为中的方法,嗯,这个与traits也一样。
好吧,来个简单的例子:
- <?php
- class Base {
- public function sayHello() {
- echo 'Hello ';
- }
- }
- trait SayWorld {
- public function sayHello() {
- parent::sayHello();
- echo 'World!';
- }
- }
- class MyHelloWorld extends Base {
- use SayWorld;
- }
- $o = new MyHelloWorld();
- $o->sayHello();
- ?>
Yii的用法:
PHP代码- <?php
- class xxx extends CBehavior
- {
- public function show(){
- echo "show";
- }
- }
- class test extends CComponents
- {
- public function hello(){
- $this->attachBehavior('唯一标记符',"xxx");
- $this->show();
- }
- }
看看,是不是用法一样?不过这样也带来一个问题。。。TMD,没法在IDE里面自动识别了。
好吧,只能这样折腾自己了。。忍忍。
php freetds 处理sqlserver大字段的问题
freetds连接sqlserver是没问题,在连接的时候dsn用的是dblib,而不是mssql。
连接和普通的查询都没有问题,但一旦涉及到大字段,你就会发现问题多多了。比如你的字段类型是nvarchar(max),你在处理的时候你会发现,返回结果都是空。
我晶啊。看来php连接sqlserver还是用windows自己的方案吧:sqlsrv这个组件,但它只能在windows下面使用。
太纠结了
APC支持php5.4了
时隔一年多,APC终于又更新了,这次更新最大的就是支持PHP5.4:
- Add PHP 5.4 support (Dmitry, Anatoliy, Pierre)
- Fixed bug #22679: Fix apc_bin_dump for constants. Use IS_CONSTANT_TYPE_MASK to handle all the constants, including the unqalified ones (instead of ~IS_CONSTANT_INDEX check)
- Fixed bug #23822, php crashes on apache restart
下载地址在这里:
http://pecl.php.net/package/APC
配置完后还得加入这些信息:
- ; alternative php cache 用于缓存和优化php中间代码
- apc.cache_by_default = on
- ;sys
- ; 是否默认对所有文件启用缓冲。
- ; 若设为off并与以加号开头的apc.filters指令一起用,则文件仅在匹配过滤器时才被缓存。
- apc.enable_cli = off
- ;sys
- ; 是否为cli版本启用apc功能,仅用于测试和调试目的才打开此指令。
- apc.enabled = on
- ; 是否启用apc,如果apc被静态编译进php又想禁用它,这是唯一的办法。
- apc.file_update_protection = 2
- ;sys
- ; 当你在一个运行中的服务器上修改文件时,你应当执行原子操作。
- ; 也就是先写进一个临时文件,然后将该文件重命名(mv)到最终的名字。
- ; 文本编辑器以及 cp, tar 等程序却并不是这样操作的,从而导致有可能缓冲了残缺的文件。
- ; 默认值 2 表示在访问文件时如果发现修改时间距离访问时间小于 2 秒则不做缓冲。
- ; 那个不幸的访问者可能得到残缺的内容,但是这种坏影响却不会通过缓存扩大化。
- ; 如果你能确保所有的更新操作都是原子操作,那么可以用 0 关闭此特性。
- ; 如果你的系统由于大量的io操作导致更新缓慢,你就需要增大此值。
- apc.filters =
- ;sys
- ; 一个以逗号分隔的posix扩展正则表达式列表。
- ; 如果源文件名与任意一个模式匹配,则该文件不被缓存。
- ; 注意,用来匹配的文件名是传递给include/require的文件名,而不是绝对路径。
- ; 如果正则表达式的第一个字符是"+"则意味着任何匹配表达式的文件会被缓存,
- ; 如果第一个字符是"-"则任何匹配项都不会被缓存。"-"是默认值,可以省略掉。
- apc.ttl = 0
- ;sys
- ; 缓存条目在缓冲区中允许逗留的秒数。0 表示永不超时。建议值为7200~36000。
- ; 设为 0 意味着缓冲区有可能被旧的缓存条目填满,从而导致无法缓存新条目。
- apc.user_ttl = 0
- ;sys
- ; 类似于apc.ttl,只是针对每个用户而言,建议值为7200~36000。
- ; 设为 0 意味着缓冲区有可能被旧的缓存条目填满,从而导致无法缓存新条目。
- apc.gc_ttl = 3600
- ;sys
- ; 缓存条目在垃圾回收表中能够存在的秒数。
- ; 此值提供了一个安全措施,即使一个服务器进程在执行缓存的源文件时崩溃,
- ; 而且该源文件已经被修改,为旧版本分配的内存也不会被回收,直到达到此ttl值为止。
- ; 设为零将禁用此特性。
- apc.include_once_override = off
- ;sys
- ; 关于该指令目前尚无说明文档,参见:http://pecl.php.net/bugs/bug.php?id=8754
- ; 请保持为off,否则可能导致意想不到的结果。
- apc.max_file_size = 1m
- ;sys
- ; 禁止大于此尺寸的文件被缓存。
- apc.mmap_file_mask =
- ;sys
- ; 如果使用–enable-mmap(默认启用)为apc编译了mmap支持,
- ; 这里的值就是传递给mmap模块的mktemp风格的文件掩码(建议值为"/tmp/apc.xxxxxx")。
- ; 该掩码用于决定内存映射区域是否要被file-backed或者shared memory backed。
- ; 对于直接的file-backed内存映射,要设置成"/tmp/apc.xxxxxx"的样子(恰好6个x)。
- ; 要使用posix风格的shm_open/mmap就需要设置成"/apc.shm.xxxxxx"的样子。
- ; 你还可以设为"/dev/zero"来为匿名映射的内存使用内核的"/dev/zero"接口。
- ; 不定义此指令则表示强制使用匿名映射。
- apc.num_files_hint = 1000
- ;sys
- ; web服务器上可能被包含或被请求的不同源文件的大致数量(建议值为1024~4096)。
- ; 如果你不能确定,则设为 0 ;此设定主要用于拥有数千个源文件的站点。
- apc.optimization = 0
- ; 优化级别(建议值为 0 ) 。
- ; 正整数值表示启用优化器,值越高则使用越激进的优化。
- ; 更高的值可能有非常有限的速度提升,但目前尚在试验中。
- apc.report_autofilter = off
- ;sys
- ; 是否记录所有由于early/late binding原因而自动未被缓存的脚本。
- apc.shm_segments = 1
- ;sys
- ; 为编译器缓冲区分配的共享内存块数量(建议值为1)。
- ; 如果apc耗尽了共享内存,并且已将apc.shm_size指令设为系统允许的最大值,
- ; 你可以尝试增大此值。
- apc.shm_size = 30
- ;sys
- ; 每个共享内存块的大小(以mb为单位,建议值为128~256)。
- ; 有些系统(包括大多数bsd变种)默认的共享内存块大小非常少。
- apc.slam_defense = 0
- ;sys(反对使用该指令,建议该用apc.write_lock指令)
- ; 在非常繁忙的服务器上,无论是启动服务还是修改文件,
- ; 都可能由于多个进程企图同时缓存一个文件而导致竞争条件。
- ; 这个指令用于设置进程在处理未被缓存的文件时跳过缓存步骤的百分率。
- ; 比如设为75表示在遇到未被缓存的文件时有75%的概率不进行缓存,从而减少碰撞几率。
- ; 鼓励设为 0 来禁用这个特性。
- apc.stat = on
- ;sys
- ; 是否启用脚本更新检查。
- ; 改变这个指令值要非常小心。
- ; 默认值 on 表示apc在每次请求脚本时都检查脚本是否被更新,
- ; 如果被更新则自动重新编译和缓存编译后的内容。但这样做对性能有不利影响。
- ; 如果设为 off 则表示不进行检查,从而使性能得到大幅提高。
- ; 但是为了使更新的内容生效,你必须重启web服务器。
- ; 这个指令对于include/require的文件同样有效。但是需要注意的是,
- ; 如果你使用的是相对路径,apc就必须在每一次include/require时都进行检查以定位文件。
- ; 而使用绝对路径则可以跳过检查,所以鼓励你使用绝对路径进行include/require操作。
- apc.user_entries_hint = 100
- ;sys
- ; 类似于num_files_hint指令,只是针对每个不同用户而言。
- ; 如果你不能确定,则设为 0 。
- apc.write_lock = on
- ;sys
- ; 是否启用写入锁。
- ; 在非常繁忙的服务器上,无论是启动服务还是修改文件,
- ; 都可能由于多个进程企图同时缓存一个文件而导致竞争条件。
- ; 启用该指令可以避免竞争条件的出现。
- apc.rfc1867 = off
- ;sys
- ; 打开该指令后,对于每个恰好在file字段之前含有apc_upload_progress字段的上传文件,
- ; apc都将自动创建一个upload_的用户缓存条目(就是apc_upload_progress字段值)。
这样就差不多OK了
好文推荐:PHP 杂谈《重构-改善既有代码的设计》之一 重新组织你的函数
不清楚这些博客是否还会连载,要知道连载这东西真的很耗精力,如果编辑器不好、如果不能自动保存,真的很可能是会失去连载的信息的。事实上,我就是因为这些问题放弃了一些文章的连载。辛苦写了上千字,结果因为编辑器的问题一下子消失了。
再过一段时间,我还是会准备将博客转换到typecho或者wordpress上,毕竟这两个博客软件都是可以支持xmlrpc来投稿的。这样,我就可以用第三方软件来投稿了。(firefox有插件,黑黑)
上链接了,不然会被人骂:(如果有更新,我这里也会同步更新链接,或者你就直接移步该作者的博客吧)
- PHP __autoload()方法真的影响性能吗?
- PHP 杂谈《重构-改善既有代码的设计》之一 重新组织你的函数
- PHP 杂谈《重构-改善既有代码的设计》之二 对象之间搬移特性
- PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据
- PHP 杂谈《重构-改善既有代码的设计》之四 简化条件表达式
暂时只有5篇关于PHP的,这还有一篇对话也可以看看:PHP 跟老大的对话。
因为其中这一段可以拿来共勉: XML/HTML代码
- 题外话:曾经我在离开一家工作一年的公司的时候!项目经理就跟我说你如果频繁跳槽,会对你的将来的发展是不利的,但是没有告诉我怎么不利?现在我有点明白了,因为我到过的公司很多技术过硬的人,都是在这个公司带过3年以上的人。我发现如果你在一家公司待很长时间,对你的技术提升是很有帮助的。
- 1》 不停的重构代码,提升你的代码质量。
- 我们开始进入公司的时候,一般都是公司急需赶个项目人手缺乏。等项目完成,一般都是1年左右。如果你在公司待足够长的时间,这个项目多多少少会跟你扯上边的,这时候,你会不停的翻看自己的代码,你也会不断的调整代码, 不断的重构你的代码——跟写文章一眼,你不停的看自己写过的文章,你会不停的做修改,越修改你的文章会越让你喜欢。
- 2》业务熟悉,能够更快更好的写出代码!——我个人比较喜欢“行云流水”似的感觉。
- 你如果在一个公司待了很长一段时间,那么你对这个领域是非常熟悉的。新需求上来,你会很快的知道怎么做代码架构,比如上面提到的,你就知道方法中,哪些代码部分可以抽出来,独立做成一个方法;你也会知道,将来什么地方会频繁修改的。——写代码,如行云流水般!
Yii框架中使用PDO时强制将表字段设为小写的BUG
Yii框架的使用者越来越多,虽然大多数情况下都能够被使用的很正常,但偶尔还是有一些小问题,比如mysql对库名和表名区分大小写,但字段名不区分;这个问题就给Yii框架使用者带来很大的烦恼,特别是这个表还不是自己设计的,只是你拿来使用的,这个郁闷程度啊。
于是有人提醒我,应该这么用,在components中的db数组里加入:attributes=>array(PDO::ATTR_CASE,PDO::CASE_LOWER),以达到强制小写的目的,嗯,想法是好的,但是gii没法用了,gii直接报错,排查了半天,发现可能是CMysqlSchema这个类中的createColumn方法导致的错误,因为当你设置为列名小写后,这个方法中的一些判断却还是用的大写,于是很多变量就找不到了,没有办法继续下一步操作,于是我改了一下这个函数:
- /**
- * Creates a table column.
- * @param array $column column metadata
- * @return CDbColumnSchema normalized column metadata
- */
- protected function createColumn($column) {
- $column = array_change_key_case($column, CASE_LOWER);
- $c = new CMysqlColumnSchema;
- $c->name = $this->getDbConnection()->getColumnCase() == PDO::CASE_LOWER
- ? strtolower($column['field'])
- : ($this->getDbConnection()->getColumnCase() == PDO::CASE_UPPER ? strtoupper($column['field'])
- : $column['field']);
- $c->rawName = $this->quoteColumnName($c->name);
- $c->allowNull = $column['null'] === 'YES';
- $c->isPrimaryKey = strpos($column['key'], 'PRI') !== false;
- $c->isForeignKey = false;
- $c->init($column['type'], $column['default']);
- $c->autoIncrement = strpos(strtolower($column['extra']), 'auto_increment') !== false;
- return $c;
- }
当然上面的代码很粗燥,我也只是先临时解决这个问题,这么写之后,马上gii就恢复正常了。黑黑
顺便再说一个技巧:以前用gii的时候,对于生成model类都是一个个的输入一个个的生成,总想着应该可以批量生成,但一直不知道如何操作,直到昨天在解决上面的问题时,发现原来在gii里有这样一段代码:
- if($this->tableName[strlen($this->tableName)-1]==='*')
我晶啊,原来那个表名可以写成*啊,这样就是自动生成整个数据库的model了,哎,以前居然一直没在意。
phpsqlsrv for windows
http://www.microsoft.com/download/en/confirmation.aspx?id=20098
其实在很久前就有这玩意了,现在居然是3.0了。在win下用这个驱动好啊,支持最新的Sql server,而且速度很快。同时,它居然还支持了PDO。。。
下载下来很方便,有几种不同的文件,根据你当前的情况来设置:
Perform the following steps to download and install the Microsoft Drivers for PHP for SQL Server:
1. Download SQLSRV30.EXE to a temporary directory
2. Run SQLSRV30.EXE
3. When prompted, enter the path to the PHP extensions directory
4. After extracting the files, read the Installation section of the SQLSRV30_Readme.htm file for next steps
看着readme一步一步就Over了。
08年的时候根据第一版的文件写过一个很简单的连接库,替换掉了当时discuz的sql连接库。现在。。。还是用PDO吧
Microsoft SQL Server Functions (PDO_SQLSRV)
PDO_SQLSRV is a driver that implements the PHP Data Objects (PDO) interface to enable access from PHP to MS SQL Server (starting with SQL Server 2005) and SQL Azure databases.
InstallationThe PDO_SQLSRV extension is enabled by adding appropriate DLL file to your PHP extension directory and the corresponding entry to the php.ini file. The PDO_SQLSRV download comes with several driver files. Which driver file you use will depend on 3 factors: the PHP version you are using, whether you are using thread-safe or non-thread-safe PHP, and whether your PHP installation was compiled with the VC6 or VC9 compiler. For example, if you are running PHP 5.3, you are using non-thread-safe PHP, and your PHP installation was compiled with the VC9 compiler, you should use the php_pdo_sqlsrv_53_nts_vc9.dll file. (You should use a non-thread-safe version compiled with the VC9 compiler if you are using IIS as your web server). If you are running PHP 5.2, you are using thread-safe PHP, and your PHP installation was compiled with the VC6 compiler, you should use the php_pdo_sqlsrv_52_ts_vc6.dll file.
For more information about system requirements, see » SQLSRV System Requirements.
The PDO_SQLSRV extension is only compatible with PHP running on Windows. For Linux, see ODBC and » Microsoft's SQL Server ODBC Driver for Linux.
System Requirements (Microsoft Drivers for PHP for SQL Server)SQL Server 2008 R2
To access data in a SQL Server 2005 or later database using the Microsoft Drivers for PHP for SQL Server, you must have the following components installed on your computer:
-
Supported operating systems for version 3.0 of the driver include:
-
Windows Server 2008 R2 SP1
Windows Vista SP2
Windows Server 2008 SP2
Windows 7 SP1
-
-
Supported operating systems for version 2.0 of the driver include:
-
Supported operating systems for version 2.0 of the driver include:
-
Windows Server 2003 Service Pack 1
-
Windows XP Service Pack 3
-
Windows Vista Service Pack 1 or later
-
Windows Server 2008
-
Windows Server 2008 R2
-
Windows 7
-
-
PHP 5. For information about how to download and install the latest stable binaries, visit http://php.net.
Microsoft Drivers for PHP for SQL Server, version 3.0 requires PHP 5.3.0 or later. If possible, use PHP 5.3.6, or later. The version 2.0 driver works with PHP 5.2.4 or later. If possible, use PHP 5.2.13, or later.
-
A version of the driver file must be in your PHP extension directory. See Driver Versions later in this topic for information about the different driver files. See Loading the Microsoft Drivers for PHP for SQL Server for information on configuring the driver for the PHP runtime.
(See The Data Center for the Microsoft Drivers for PHP for SQL Server for information on where to download the Microsoft Drivers for PHP for SQL Server.)
-
A Web server. Your Web server must be configured to run PHP. For information about hosting PHP applications with Internet Information Services (IIS) 6.0, see Using FastCGI to Host PHP Applications on IIS 6.0. For information about hosting PHP applications with IIS 7.0, see Using FastCGI to Host PHP Applications on IIS 7.0.
The Microsoft Drivers for PHP for SQL Server has been tested using IIS 6 and IIS 7 with FastCGI.
-
The x86 version of SQL Server Native Client is required on the computer where PHP is running. If you are using a 64-bit operating system, the x86 version of SQL Server Native Client will be installed with the x64 version of SQL Server Native Client (do not install the x86 version of SQL Server Native Client on an x64 operating system).
If you are using the SQLSRV driver, sqlsrv_client_info will return information about which version of SQL Server Native Client is being used by the Microsoft Drivers for PHP for SQL Server. If you are using the PDO_SQLSRV driver, you can use PDO::getAttribute to discover the version.
-
Version 3.0 of the driver requires Microsoft SQL Server 2012 Native Client. You can download Microsoft SQL Server 2012 Native Client from the SQL Server 2012 feature pack page.
-
Version 2.0 of the driver requires Microsoft SQL Server 2008 R2 Native Client. Click on the appropriate link below:
-
This section lists the drivers that are installed for version 2.0 and version 3.0 of the Microsoft Drivers for PHP for SQL Server. PHP version 5.2 is not supported in version 3.0 of the Microsoft Drivers for PHP for SQL Server.
Follow the installation instructions in Loading the Driver to configure the driver for use with the PHP runtime.
Microsoft Drivers 2.0 for PHP for SQL Server installs several versions of the driver:
Driver file
PHP version
Thread safe?
Use with PHP .dll
php_sqlsrv_53_nts_vc6.dll
php_pdo_sqlsrv_53_nts_vc6.dll
5.3
no
php5.dll
php_sqlsrv_53_nts_vc9.dll
php_pdo_sqlsrv_53_nts_vc9.dll
5.3
no
php5.dll
php_sqlsrv_53_ts_vc6.dll
php_pdo_sqlsrv_53_ts_vc6.dll
5.3
yes
php5ts.dll
php_sqlsrv_53_ts_vc9.dll
php_pdo_sqlsrv_53_ts_vc9.dll
5.3
yes
php5ts.dll
php_sqlsrv_52_nts_vc6.dll
php_pdo_sqlsrv_52_nts_vc6.dll
5.2
no
php5.dll
php_sqlsrv_52_ts_vc6.dll
php_pdo_sqlsrv_52_ts_vc6.dll
5.2
yes
php5ts.dll
If the name of the driver file contains "vc9", it should be used with a PHP version compiled with Visual C++ 9.0.
Microsoft Drivers 3.0 for PHP for SQL Server installs several versions of the driver:
Driver file
PHP version
Thread safe?
Use with PHP .dll
php_sqlsrv_53_nts.dll
php_pdo_sqlsrv_53_nts.dll
5.3
no
php5.dll
php_sqlsrv_53_ts.dll
php_pdo_sqlsrv_53_ts.dll
5.3
yes
php5ts.dll
phpQuery的一个小疑问。
最近在使用phpQuery处理xml的时候发生了一点小问题。由于xml还算是比较规范,但我又不想用simplexml_load_string,所以就偷懒用phpQuery处理了。
但在处理的时候发现一个问题,比如我要处理的内容是:
- <title>揭秘日本巨型OLED地球仪:实时显示地球变化</title>
- <link>http://news.dili360.com/gclw/xxjs/2012/0312/32136.shtml</link>
- <description><a href='http://news.dili360.com/gclw/xxjs/2012/0312/32136.shtml'><img src='http://image.dili360.com/news/gclw/xxjs/2012/0312/36_5132136203_20120312094816.jpg' style='border: 1px solid #000000;'/></a> 新浪科技讯 北京时间3月12日消息,据国外媒体报道,如果你前往日本东京,别忘了去参观一下“未来科学馆”(Miraikan),这里展示着一些最尖端的技术成就。就在去年年中,这里揭幕了全世界首个大型OLED显示屏,直径超过19英尺(约合5.8米)。尽管名叫“Geo-Cosmos”,但这并非一般的地球仪,它几乎能实时显示我们这颗星球上正在发生的一切!全球各地的科学家和研究机构将数据发送给Geo-Cosmos,后者将其呈现给观众。 这..</description>
- <category>中国国家地理网地理资讯频道</category>
- <author>dili360.com</author>
- <pubdate>2012-03-12 09:48:16</pubdate>
请看加红的那一段。
当我用phpQuery处理完后,发现,右边的</link>不见了。其他元素都正常。我的心一下子就碎了。
开始以为页面有问题,但怎么处理都是这样,最终只能将link换成了url来 进行处理。说实话,心是哇凉哇凉的。。
但是,同事在win下面就没有这个问题,我在ubuntu下就有这个问题。(我现在不知道是否我的PHP版本有问题,还是平台的问题,也没有心思深究了)【同事是5.3.9,我是5.3.6】,
Using Redis as a backend for Active Record
说白了,yiiredis中的AR功能的model其实就是一个hash,只是稍作封装了而已
官方有例子:
It is possible to store active record like structures in redis using ARedisRecord.
Note: this is experimental functionality and may be subject to change
$record = ARedisRecord::model()->findByPk(1); // loads a record with a unique id of 1 $record->name = "a test name"; // sets the name attribute on the record $record->somethingElse = "some other value"; $record->save(); // saves the record to redis $record->delete(); // deletes the record from redis不过,上面的例子不能直接拿来用,因为ARedisRecord是一个abstract类,所以你得写一个类继承于他才行。
顺便,如果用setAttributes的时候,记得加第二个参数(除非你写了rules),否则一定要加第二个参数,不然save不成功哦。
昨天被它折腾了好久才发现
----
笔记而已
开始启用Yii的redis插件
该死的command+左箭头。。。写了十分钟的东西全没了。
-------重新开始-----
由于目前的一个项目涉及到的数据库需要跨库跨表操作,而且该库会被频繁的插入、更新、删除,所以相对速度会较慢。但查询量又较大,在一台服务器的情况下,怎么办?分端口主从吧,意义不大,因为某些操作会导致CPU瞬间100%。
这时候我想到了key/value的数据库,想用它来做中间处理,比如大量的内容先经过它,再真正入库,毕竟我不需要过分实时,也不涉及到金钱交易。于是乎就在redis和mongo中间犹豫了。
在这期间咨询了三个人:老王(基于博客http://huoding.com/2012/02/29/146,基于Redis消息系统实现);11爷(redis有pub/sub功能);烂桔(mongo不太适用于单机,redis有内存模式)
基于上述原因,于是选择了redis,那么就开始我的Redis之旅吧
1、安装 Redis ,参考:http://library.linode.com/databases/redis/ubuntu-10.10-maverick(如果我没记错,这应该是11爷推荐的地址,他本来推荐的是Centos下的,但我用的是ubuntu,所以就参考这个了)
先来三个常规操作
- apt-get update
- apt-get upgrade
- apt-get install build-essential
完事之后,接着:
XML/HTML代码- cd /opt/
- mkdir /opt/redis
- wget http://redis.googlecode.com/files/redis-2.4.8.tar.gz
- tar -zxvf /opt/redis-2.4.8.tar.gz
- cd /opt/redis-2.4.8/
- make
make完后做如下操作,将一些配置文件拷贝到/opt/redis目录下:
XML/HTML代码- cp /opt/redis-2.4.8/redis.conf /opt/redis/redis.conf.default
- cp /opt/redis-2.4.8/src/redis-benchmark /opt/redis/
- cp /opt/redis-2.4.8/src/redis-cli /opt/redis/
- cp /opt/redis-2.4.8/src/redis-server /opt/redis/
- cp /opt/redis-2.4.8/src/redis-check-aof /opt/redis/
- cp /opt/redis-2.4.8/src/redis-check-dump /opt/redis/
- cp /opt/redis/redis.conf.default /opt/redis/redis.conf
接着,更新/opt/redis/redis.conf:
XML/HTML代码- daemonize yes
- pidfile /var/run/redis.pid
- logfile /var/log/redis.log
- port 6379
- bind 127.0.0.1
- timeout 300
- loglevel notice
- ## Default configuration options
- databases 16
- save 900 1
- save 300 10
- save 60 10000
- rdbcompression yes
- dbfilename dump.rdb
- dir /opt/redis/
- appendonly no
以上是linode里的配置,你可以参考一下做处理。大部分都一样,但timeout/loglevel/dir这三个参数不太一样。可以看着注释改一下。 linode 中有一个:glueoutputbuf yes ,这个在2.4.8下面会出错,所以我就没有启用它。
接着是加入启用脚本,既然linode有配置参考,那么它就有启动脚本,默认redis是没有给你这些启动脚本的,所以偷懒一下吧,下载linode的脚本:
- cd /opt/
- wget -O init-deb.sh http://library.linode.com/assets/630-redis-init-deb.sh
- adduser --system --no-create-home --disabled-login --disabled-password --group redis
- mv /opt/init-deb.sh /etc/init.d/redis
- chmod +x /etc/init.d/redis
- chown -R redis:redis /opt/redis
- touch /var/log/redis.log
- chown redis:redis /var/log/redis.log
- update-rc.d -f redis defaults
在这一步之后,你就可以直接用/etc/init.d/redis 来 start和stop redis服务了。
2、安装phpredis(https://github.com/nicolasff/phpredis)
在安装之前,先看readme:https://github.com/nicolasff/phpredis/blob/master/README.markdown
看完readme之后你会发现,原来一切是这样的简单啊
OK,先wget 回源代码,然后tar解开目录。。
接着3步搞定:
- phpize
- ./configure
- make && make install
速度超快,make install后,会告诉你redis.so生成在哪里,你将这extension=redis.so,加入到你的php.ini中即可。
3、下载YiiRedis项目。(由于我是用Yii的,所以直接用这个插件了,否则,还是参考一下phpredis的一些用法)
同样,在这里有readme:https://github.com/phpnode/YiiRedis/blob/master/README.md
项目地址:https://github.com/phpnode/YiiRedis(请自行下载)
使用方法也很简单,和db一样,在components下加一个组件:
- "components" => array(
- "redis" => array(
- "class" => "packages.redis.ARedisConnection",
- "hostname" => "localhost",
- "port" => 6379
- ),
- //...
- ),
加完它之后就可以写上一段测试代码了:
PHP代码- Yii::import("ext.yiiredis.*");
- $list = new ARedisList("aNameForYourListGoesHere");
- $list->add("cats");
- $list->add("dogs");
- $list->add("goods");
- foreach($list as $i => $val) {
- print_r($val) ;
- echo "<br />";
- }
- $list->clear(); // delete the list
直接输出在浏览器中。是不是很HIGH?
------
OK,就介绍到这里,请试用吧。
=------
备注:
$redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_NONE); // don't serialize data
$redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_PHP); // use built-in serialize/unserialize
$redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_IGBINARY); // use igBinary serialize/unserialize
$redis->setOption(Redis::OPT_PREFIX, 'myAppName:'); // use custom prefix on all keys
由于redis默认不做序列化,因此如果要存储PHP的数据,如:数组、对象,那就必须用第二个setOption进行设置,以便 让数据自动序列化
Yii Framework DB 中的一些参数
Yii的AR一直在被使用,当然,偶尔也只是看看其中的参数,都是直接把main.php中的数据注释掉就完事了
但事实上我们都忽略了一点点现实,那就是默认参数是没有什么性能提升的。
1、'schemaCachingDuration'=>3600,
这个在默认参数中是不存在的,如果你的表结构不太变动,完全可以不需要每次都show columns,show create table之类的。加上这个参数,可以将表结构缓存一小时(嗯,前提是,你配置了cache组件)
2、emulatePrepare=true ,这个是默认里面就带有的,它有什么用呢?
官方是这样说的:whether to turn on prepare emulation. Defaults to false, meaning PDO will use the native prepare support if available. For some databases (such as MySQL), this may need to be set true so that PDO can emulate the prepare support to bypass the buggy native prepare support. Note, this property is only effective for PHP 5.1.3 or above.
好吧,为了以防万一,还是打开算了
3、'enableProfiling'=>true
如果你想优化代码的话,可以尝试设置为true看看。官方在guide里说:By setting CDbConnection::enableProfiling to be true in the application configuration, every SQL statement being executed will be profiled. The results can be readily displayed using the aforementioned CProfileLogRoute, which can show us how much time is spent in executing what SQL statement. We can also call CDbConnection::getStats() to retrieve the total number SQL statements executed and their total execution time.
4、 'enableParamLogging'=>true,
这个就相对比较简单了,如果你设置为True,你在log中,就可以看到你的每次参数的参数是什么了,而不是:y01:y02这样的顺序变量。
5、tablePrefix = "xxx",这没什么好解释的。。。
6、charset="xxx" ,也没有什么好解释的,utf-8的话,中间的减号不要。。
这些都是常用的。。所以列出来
PHP 5.4.0 released!
The PHP development team is proud to announce the immediate availability of PHP 5.4.0. This release is a major leap forward in the 5.x series, which includes a large number of new features and bug fixes.
Some of the key new features include: traits, a shortened array syntax, a built-in webserver for testing purposes and more. PHP 5.4.0 significantly improves performance, memory footprint and fixes over 100 bugs.
For users upgrading from PHP 5.3 there is a migration guide available here, detailing the changes between those releases and PHP 5.4.0.
Further details about the PHP 5.4.0 release can be found in the release announcement, and the full list of changes are available in the ChangeLog.
Please note that it may take a while until the release is available on all mirrors.
----------
你还在犹豫什么?而且,传说中性能提高了超级多,20倍?50倍?太夸张了,不过提升一点点我还是可信的
diogin在大致浏览了下,稍作了整理:
增加 cli-server SAPI
FPM SAPI 增加 process.max 配置项
增加 http_response_code(), get_declared_traits(), trait_exists(), header_register_callback(), class_uses() 函数
增加 Closure::bind(), Closure::bindTo() 方法
mysql, mysqli 扩展默认使用 mysqlnd
增加 trait
增加关键字 callable,insteadof
E_ALL 包含了 E_STRICT
增加了 <?=
支持 (new Foo)->bar()
支持 0b001001101
支持 $a = [1, 2, 3, 4]; $b = ['one' => 1, 'two' => 2, 'three' => 3];
支持 Class::{expr}()
支持 foo()[0]
闭包里支持 $this 引用
continue $v,break $v 不再支持
缺省时区设为 UTC
缺省编码设为 UTF-8
------
一个MINI的测试server还是有点用的。难道它也想象nodejs那样?谁知道呢
