手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表全部文章

PHP 5.4 更新

有些更新由于没有仔细看,结果就出错了,所以,还是COPY出来,以后查起来方便一点,顺便告诉自己,session函数有部分不能用了。。。

Backward Incompatible Changes

Although most existing PHP 5 code should work without changes, please take note of some backward incompatible changes:

  • Safe mode is no longer supported. Any applications that rely on safe mode may need adjustment, in terms of security.【如果有运行在安全模式下的程序,要发了。。。。】
  • Magic quotes has been removed. Applications relying on this feature may need to be updated, to avoid security issues. get_magic_quotes_gpc() and get_magic_quotes_runtime() now always return FALSE. 【这个是早就知道了】set_magic_quotes_runtime() raises an E_CORE_ERROR level error.
  • The register_globals and register_long_arrays php.ini directives have been removed.【第二个函数没用过,现在也不用了】
  • Call-time pass by reference has been removed.【早就不用了。。。。】
  • The break and continue statements no longer accept variable arguments (e.g., break 1 + foo() * $bar;). Static arguments still work, such as break 2;.【HOHO,这个嘛。。。不影响 】
  • In the date and time extension, the timezone can no longer be set using the TZ environment variable. Instead you have to specify a timezone using the date.timezone php.ini option or date_default_timezone_set() function. PHP will no longer attempt to guess the timezone, and will instead fall back to "UTC" and issue a E_WARNING.【这个可能需要注意了。。。。】
  • Non-numeric string offsets - e.g. $a['foo'] where $a is a string - now return false on isset() and true on empty(), and produce a E_WARNING if you try to use them. Offsets of types double, bool and null produce a E_NOTICE. Numeric strings (e.g. $a['2']) still work as before. Note that offsets like '12.3' and '5 foobar' are considered non-numeric and produce a E_WARNING, but are converted to 12 and 5 respectively, for backward compatibility reasons.【。。。。。会有意外了】
  • Converting an array to a string will now generate an E_NOTICE level error, but the result of the cast will still be the string "Array".
  • Turning NULL, FALSE, or an empty string into an object by adding a property will now emit an E_WARNING level error, instead of E_STRICT.
  • Parameter names that shadow super globals now cause a fatal error. This prohibits code like function foo($_GET, $_POST) {}.【难道有人这么用过???】
  • The Salsa10 and Salsa20 hash algorithms have been removed.
  • array_combine() now returns array() instead of FALSE when two empty arrays are provided as parameters.
  • If you use htmlentities() with asian character sets, it works like htmlspecialchars() - this has always been the case in previous versions of PHP, but now an E_STRICT level error is emitted.

The following keywords are now reserved, and may not be used as names by functions, classes, etc.

The following functions have been removed from PHP:

升级sablog 2.0失败

纠结了很久,还是失败了。
看了一下出问题的step,发现是drop table的问题,我开始以为是我的权限有问题。但。。。我设置为ROOT也没用。所以暂时不升级了。真纠结啊

---------
顺便:
从PHP5.4开始,session_register函数禁用了。所以,如果还在使用Sablog1.6的人,记着。。。seccode.php中,这一行注释掉,否则。。。验证码就出不来了。
---------
由于升级到5.4后,默认display_error为OFF,所以很多错误 都显示不出来,排查了好久才解决这个问题啊。

Tags: sablog

转:辞职创业常犯的5大错误

有两个朋友辞职创业了,一个是阿里系的,一个是QQ系的。一两年前也曾经有这样的想法,但最终还是不够大胆,帮人打工和帮自己打工,我选择了前者。其实当时如果有两个项目可以维持,说不定就真的投入了。。。。
上文章看看误区先,这是创业帮的一篇文章 :http://xueyuan.cyzone.cn/gushi-ganwu/224015.html

很多人都会梦想能够辞掉工作自己创业,尤其是那些在职场为晋升努力了很多年的人。但是每次工作变动都会伴随着诸多风险,而辞职创业这样的转变更是件高风险的事儿。对个人来说,创业是一次重大的跨越,尤其在当前经济不稳定的条件下,创业更需要做好充分的准备。

多年前,《哈佛商业评论》(Harvard Business Review)刊登了一篇文章,名为《跳槽者应避免的5种错误做法》,文章列举了普通人在换工作时常犯的5种错误。我敢肯定,这其中的每一条都适用于那些 正考虑辞职,打算自己或与他人合伙创业的人。这5种常犯的错误如下:

1、未做充分调查研究。换工作之前,起码有这样几个问题需要考虑:你的目标、财务稳定性、企业文化契合度以及工作职责。那些打算辞职创业的人都有必要思考一下以上所有问题。或者与一些经验丰富的创业者谈谈你的创业计划,看看你的想法是否切合实际,获得肯定后再辞职。

2、单纯为钱辞职创业。记住,“这山望着那山高”是多数人的通病。创业在短期内不太可能赚到比打工更多钱,实际上,往往相反,大多数创业者在刚开始 1-2年内是没有收入的,而且也很难找到对其创业项目感兴趣的投资人。我时常告诫打算创业的人,最好在创业项目产生实际收入后,再辞去日常工作。

3、创业是为了逃避工作。如果你不顾一切地铤而走险,开始创业,你可能发现你的创业之路举步维艰,与受雇于人比起来,压力更大而且状况更无法让人满 意。工作量大、工作不被认可或压力过大不是创业的理由,也通常得不到令人满意的结果。而那些认为自己有能力,但是对眼下所从事的工作不满意或者厌倦的人, 反倒更适合做创业者。

4、高估自己。根据很多猎头顾问的观点,现在很多求职者对他们的工作技能、职业规划和弱点的认识都不切合实际。如果你在几家公司的工作经历都不愉快,那么很可能你也存在类似问题。而这些问题会在创业过程中会进一步放大,因为你现在是公司的老板,并且要为所有问题负责。

5、没有长远打算。从受雇于人到创业者是生活方式的重大转变,也是职业生涯的重大转变。创业不是在短期内可以积累大量财富的捷径,更不是逃避问题的方法。创业是一项艰苦的工作,只有通过不断学习和坚持不懈才能有所回报。

很明显,以上这些错误的做法有一定的内在关联性。当人们对自己估计过高,就会更加看重工作绩效的回报,并且对公司所给的报酬感到不满。这种状态会导 致他们冲动地做出创业决定,而对自己创业能力和创业机会缺乏认真考虑,在创业过程中他们也往往失望地会发现,创业更加让人不自在。

所有打工者都需要对上述这些问题进行认真的考虑,因为根据美国劳动统计局(U.S. Bureau of Labor Statistics)的统计数据,婴儿潮出生的人一生平均要换10次工作。在一家公司工作到退休或者一生都在创业的时代已经一去不复返了。近年来商业环 境快速变化,所以我们也需要与时俱进。

决定创业之前,可以问自己这样一个问题“如果事实证明我的决定错了怎么办?”要做好减少损失和勇往直前的准备。再三地从一种困境跳入另一种困境是不 可取的,不管在哪种情形下,都要认真对自己的优点和缺点有清楚的认识。乐于倾听他人对你的看法或指导,并且勇于改正自己的缺点。

还有最重要的一点,要了解工作中哪些因素能让你最感满意,对你来讲,怎样才算是达到工作与生活之间的最佳平衡状态。作为成年人,我们大多数时间都要在工作中度过,而生命却太过短暂,不应该将宝贵的时间浪费在对错误决定的懊悔中。

----------
看到上面的问题,你觉得你真的考虑好了吗?

Using Redis as a backend for Active Record

说白了,yiiredis中的AR功能的model其实就是一个hash,只是稍作封装了而已

官方有例子:

Using Redis as a backend for Active Record

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不成功哦。
昨天被它折腾了好久才发现
----
笔记而已

Tags: redis, yiiredis, phpredis

开始启用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,所以就参考这个了)
  先来三个常规操作

XML/HTML代码
  1. apt-get update  
  2. apt-get upgrade  
  3. apt-get install build-essential  

 完事之后,接着:

XML/HTML代码
  1. cd /opt/  
  2.     mkdir /opt/redis  
  3. wget http://redis.googlecode.com/files/redis-2.4.8.tar.gz  
  4. tar -zxvf /opt/redis-2.4.8.tar.gz  
  5. cd /opt/redis-2.4.8/  
  6. make  

make完后做如下操作,将一些配置文件拷贝到/opt/redis目录下:

XML/HTML代码
  1. cp /opt/redis-2.4.8/redis.conf /opt/redis/redis.conf.default  
  2. cp /opt/redis-2.4.8/src/redis-benchmark /opt/redis/  
  3. cp /opt/redis-2.4.8/src/redis-cli /opt/redis/  
  4. cp /opt/redis-2.4.8/src/redis-server /opt/redis/  
  5. cp /opt/redis-2.4.8/src/redis-check-aof /opt/redis/  
  6. cp /opt/redis-2.4.8/src/redis-check-dump /opt/redis/  
  7. cp /opt/redis/redis.conf.default /opt/redis/redis.conf  

接着,更新/opt/redis/redis.conf:

XML/HTML代码
  1. daemonize yes  
  2. pidfile /var/run/redis.pid  
  3. logfile /var/log/redis.log  
  4.   
  5. port 6379  
  6. bind 127.0.0.1  
  7. timeout 300  
  8.   
  9. loglevel notice  
  10.   
  11. ## Default configuration options  
  12. databases 16  
  13.   
  14. save 900 1  
  15. save 300 10  
  16. save 60 10000  
  17.   
  18. rdbcompression yes  
  19. dbfilename dump.rdb  
  20.   
  21. dir /opt/redis/  
  22. appendonly no  

以上是linode里的配置,你可以参考一下做处理。大部分都一样,但timeout/loglevel/dir这三个参数不太一样。可以看着注释改一下。 linode 中有一个:glueoutputbuf yes ,这个在2.4.8下面会出错,所以我就没有启用它。
接着是加入启用脚本,既然linode有配置参考,那么它就有启动脚本,默认redis是没有给你这些启动脚本的,所以偷懒一下吧,下载linode的脚本:

XML/HTML代码
  1. cd /opt/  
  2. wget -O init-deb.sh http://library.linode.com/assets/630-redis-init-deb.sh  
  3. adduser --system --no-create-home --disabled-login --disabled-password --group redis  
  4. mv /opt/init-deb.sh /etc/init.d/redis  
  5. chmod +x /etc/init.d/redis  
  6. chown -R redis:redis /opt/redis  
  7. touch /var/log/redis.log  
  8. chown redis:redis /var/log/redis.log  
  9. 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步搞定:

XML/HTML代码
  1. phpize  
  2. ./configure  
  3. 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下加一个组件:

XML/HTML代码
  1. "components" => array(  
  2.     "redis" => array(  
  3.         "class" => "packages.redis.ARedisConnection",  
  4.         "hostname" => "localhost",  
  5.         "port" => 6379  
  6.     ),  
  7.     //...  
  8. ),  

加完它之后就可以写上一段测试代码了:

PHP代码
  1. Yii::import("ext.yiiredis.*");  
  2. $list = new ARedisList("aNameForYourListGoesHere");  
  3. $list->add("cats");  
  4. $list->add("dogs");  
  5. $list->add("goods");  
  6. foreach($list as $i => $val) {  
  7.     print_r($val) ;  
  8.     echo "<br />";  
  9. }  
  10. $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进行设置,以便 让数据自动序列化

Tags: redis, yiiredis, phpredis