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

Yii的又一个BUG?

先申明一下,这个可能不是BUG。只是算起来是实现的方式不一样而已。
场景:我有一个MYSQL数据库,但是现在容量越来越大,主要是因为其中有大字段,多个大字段,所以在查询的时候会特别特别慢。所以想到用mongo来存储一些查询用的结构。单条的时候,我还是准备采用MYSQL。当然其实单条用mongo也合适。不过因为迁移数据有点麻烦,所以还是先忍忍,一步一步来。

测试阶段:因为MYSQL to MONGO有点小麻烦,没有现成的工具。官方说有mongoimport,我看过了,确实OK,但是只支持一些基础的结构,比如:json,csv等。其他的则需要第三方工具。但我自己先在测试中,所以就直接写了个脚本,先将数据用AR取出来。然后插入到mongo中。结果发现,在排序的时候。。9999比10000还大。问了一下神仙 ,他说这应该是按字符串排序的方式来做的。

于是做了一个测试,写进了一个数字,果然就对了。。难道是yii的AR的BUG?想想这不太应该啊。于是我写了一个小的Demo:

PHP代码
  1. $db = mysql_connect("localhost","root","123456");  
  2. mysql_select_db("feed");  
  3. $query = mysql_query("select id from feeds_group limit 1");  
  4. while($rs = mysql_fetch_array($query)){  
  5.     $result = $rs;  
  6.     echo "<pre>";  
  7.     var_dump($result);  
  8.     echo "</pre>";  
  9. }  
  10. echo "<hr />";  
  11. $dsn = 'mysql:host=localhost;dbname=feed';  
  12. $user = 'root';  
  13. $password = '123456';  
  14. $dbh = new PDO($dsn$user$password);  
  15. $sth = $dbh->prepare("select id from feeds_group limit 1");  
  16. $sth->execute();  
  17. $result = $sth->fetchAll();  
  18. echo "<pre>";  
  19. var_dump($result);  
  20. echo "</pre>";  

打印出来一看:

XML/HTML代码
  1. array(2) {  
  2.   [0]=>  
  3.   string(1) "1"  
  4.   ["id"]=>  
  5.   string(1) "1"  
  6. }  
  7.   
  8. array(1) {  
  9.   [0]=>  
  10.   array(2) {  
  11.     ["id"]=>  
  12.     string(1) "1"  
  13.     [0]=>  
  14.     string(1) "1"  
  15.   }  
  16. }  

 

果然出来就是字符串了,最后只能自己在插到mongo的时候写了一个小函数,对于数值型字段做了转换,问题就这样解决了。

 

 

 

 

Tags: yii, mongodb, mysql, string

NND被mongodb的limit BUG搞死了

昨天下载了php-mongo的组件进行了安装。结果在进行limit查询的时候一直reset。。查了半天,以为是语法错误 ,但最终都没有发现任何问题。当时我下的包是:https://nodeload.github.com/mongodb/mongo-php-driver/tarball/master,嗯。这是一个最新版。文件名是:mongodb-mongo-php-driver-1.3.0beta1-15-ge426381.tar.gz,一眼就可以看出这是一个beta版。我晶。。。就因为它,害得我折腾了一个晚上

各位看官:

PHP代码
  1. $mongo = new Mongo();  
  2. $db = $mongo->selectCollection('orange','archive');  
  3. $query = $db->find(array("pubdate"=>array('$gt'=>'100000000'),'status'=>array('$in'=>array('0','9'))))->limit(10);  
  4. foreach ($query as $q) {  
  5.     echo "<pre>";  
  6.     print_r($q);  
  7.     echo "</pre>";  
  8. }  

这两句没问题吧。。。但事实上在1.3中就会导致 直接reset。如果不加limit条件就一切正常。我算是。。。蛋疼了。

后来从pecl.php.net中搜索mongo,网址其实就是在:http://pecl.php.net/package/mongo,然后下载了1.2.12:http://pecl.php.net/get/mongo-1.2.12.tgz,下载完后重新编译,又是那两句简单的代码:
phpize
./configure
make install
然后重启。。。一切就太平了。

Tags: mongo

mongodb 与 redis混用

本来一直在用redis,也没有觉得不爽,直到我需要对数据进行排序。。。进行条件查询。
一下子问题就来了。redis不支持这种条件查询。
于是。。我先hmGetAll,然后利用usort先排一下序,然后再利用数组的slice进行切分。这么一处理。。只有3000多条数据,0.2秒就这么浪费了。我晕啊。这怎么可以。。。这不科学啊。

于是,0.001949 一下子就刺瞎了我的钛金狗眼。
因为mongo的查询没有redis那样方便。于是在hashset的这一块,和list的这一块,我还是用redis方便,毕竟可以当成一个简单的链表处理,还是很方便的。。

对于有条件的查询,还是用mongoDB会更方便一点。测试了一下。原来只需要mongodb 512M内存就足够了,哥很大方,给了他1G,小样,你还不开心?

Tags: nosql, mongodb, redis

mongodb 的一些常规用法和疑问

mongoDB现在对于PHP来说已经用起来很方便了,pecl直接下载安装编译类库就OK了
先下载:https://github.com/mongodb/mongo-php-driver/tarball/master
然后tar zxvf master
进入目录 。。
$ phpize
$ ./configure
$ make install
看好文件存在哪里。就存在刚才解 开的目录下的modules目录里。有一个mongo.so,OK,拷到扩展目录,然后加一行配置:extension=mongo.so

重启apache。命令行下运行 php -i |grep mongo
黑黑,一下子可以看到几段信息了吧?

-------
安装mongodb,在ubuntu下来说实在是太容易了,比如:apt-get install mongodb一下子就完事了
不想一直运行?在测试的时候运行:mongod -journal -maxConns=2400 -rest
嗯,还提供rest风格的请求。。。

-----

PHP代码
  1. $a = $c->find(array('id'=>array('$gt'=>'10000'),'status'=>array('$ne'=>"1")));//->sort(array("pubdate"=>-1));  
  2. $result = iterator_to_array($a);  
  3. echo "<pre>";  
  4. print_r($result);  
  5. echo "</pre>";  

排序什么的都方便。。。只是在这里遇到点小问题
上面这段代码能够正常输出。只是我将status换成array('$in'=>array("0","9"))的时候,就一条数据也没有了。但明明是有的,比如 上面$ne = 1,即不等于1的情况(就是0和9),可以查询到数据。。。真纠结啊
明天再测试测试。

nohup命令让Linux程序永远在后台执行

一般 来说,我们如果需要在Unix/Linux下,让某个程序后台运行,很多都是使用 & 在程序结尾来让程序自动运行。比如我们要运行mysql在后台:/usr/local/mysql/bin/mysqld_safe –user=mysql & ,不过并非每个程序都能够象mysqld一样可以做成守护进程。也许它只是普通程序而已,这时候即使用 & 结尾,如果终端关闭,那么程序也会被关闭。但为了能后台运行,就不得不使用nohup这个命令,比如我们有个start.sh需要在后台运行,并且希望在后台能够一直运行,那么就使用nohup:nohup /root/start.sh &

   

在shell中回车后提示:[~]$ appending output to nohup.out

    原程序的的标准输出被自动改向到当前目录下的nohup.out文件,起到了log的作用。但是有时候在这一步会有问题,当把终端关闭后,进程会自动被关闭,察看nohup.out可以看到在关闭终端瞬间服务自动关闭。这是因为,程序在提示了nohup成功后还需要按终端上键盘任意键退回到shell输 入命令窗口,然后通过在shell中输入exit来退出终端;如果你在nohup执行成功后直接点关闭程序按钮关闭终端。所以这时候会断掉该命令所对应的session,导致nohup对应的进程被通知需要一起shutdown。

nohup语法

  用途:不挂断地运行命令。
语法:nohup Command [ Arg … ] [ & ]
描述:nohup 命令运行由 Command 参数和任何相关参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示”and”的符号)到命令的尾部。

  无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。

  退出状态:该命令返回下列出口值:

  126 可以查找但不能调用 Command 参数指定的命令。

  127 nohup 命令发生错误或不能查找由 Command 参数指定的命令。

  否则,nohup 命令的退出状态是 Command 参数指定命令的退出状态。

  nohup命令及其输出文件

  nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup就是不挂起的意思( n ohang up)。

  该命令的一般形式为:nohup command &
       如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:nohup command > myout.file 2>&1 &

 

  在上面的例子中,输出被重定向到myout.file文件中。

Tags: nohup, 后台程序