swoole模块及使用场景

一、多任务及多进程: 用来大量采集数据时使用,再利用多进程提高效率

http://blog.csdn.net/koastal/article/details/52871316

http://www.tuicool.com/articles/ZFNFvqm

二、定时任务

https://github.com/LinkedDestiny/swoole-doc/blob/master/src/03/swoole_timer_server.php

swoole新版本已经废除掉了 timer 指令,请使用 swoole_timer_tick 代替。参考:

https://wiki.swoole.com/wiki/page/480.html

https://wiki.swoole.com/wiki/page/414.html

三、执行异步任务(耗时任务处理)

https://wiki.swoole.com/wiki/page/162.html

https://wiki.swoole.com/wiki/page/481.html

https://wiki.swoole.com/wiki/page/134.html

更多定时器请参考:https://wiki.swoole.com/wiki/search/?q=tick%E5%AE%9A%E6%97%B6%E5%99%A8

 

git无法pull仓库refusing to merge unrelated histories的解决办法

在本地有一个很久的项目,需要上传到远程git仓库中,先在远程创建了一个仓库,在本地配置好后,发现上传的时候,提示先git pull 一下,但git pull的时候提示这个错误,主要是因为目前两个git仓库信息不一致问题,我们要将两个项目合并在一起,需要添加一个  --allow-unrelated-histories 参数即可。

先进入cli命令行模式,执行

git pull origin master --allow-unrelated-histories

然后再执行git pull origin master 即可。

参考:http://stackoverflow.com/questions/37937984/git-refusing-to-merge-unrelated-histories

php中处理emoji符号

数据库表是utf8编码的, 所以在存储emoji符号的时候,直接报错,可使用以下方法:

http://stackoverflow.com/questions/12807176/php-writing-a-simple-removeemoji-function#

有时候这种方法不行,可以使用以下方法

/**
  把用户输入的文本转义(主要针对特殊符号和emoji表情)
 */
function userTextEncode($str){
    if(!is_string($str))return $str;
    if(!$str || $str=='undefined')return '';

    $text = json_encode($str); //暴露出unicode
    $text = preg_replace_callback("/(\\\u[ed][0-9a-f]{3})/i",function($str){
        return addslashes($str[0]);
    },$text); //将emoji的unicode留下,其他不动,这里的正则比原答案增加了d,因为我发现我很多emoji实际上是\ud开头的,反而暂时没发现有\ue开头。
    return json_decode($text);
}
/**
  解码上面的转义
 */
function userTextDecode($str){
    $text = json_encode($str); //暴露出unicode
    $text = preg_replace_callback('/\\\\\\\\/i',function($str){
        return '\\';
    },$text); //将两条斜杠变成一条,其他不动
    return json_decode($text);
}

当然你也可以直接将emoji之类的字符直接过滤掉,存储到数据库中。只需要将 "return addslashes($str[0]); “修改为 reuturn ''即可.

参考:https://segmentfault.com/q/1010000003711491

Laravel中的异常处理

Eloquent try/catch on duplicate key Exception and delete?

I've a form for a new vendor where the controller listens for its POST.
From there on I'm creating a new endor and the equivalential login for this vendor.

Controller :

$vendor = Vendor::create( $request->all() );  
$login = Vendor::createLogin($vendor->vendor_id);

the createLogin function :

public static function createLogin($lid){  
    $name = self::find($lid)->vendor_name;  
    $name = explode(' ', $name);  
        
    $vendor_login = [
        'username' => strtolower( end($name) ) . '.vendor',
        'group' => 'vendor'
    ];
    
    try{
        $user = User::create( $vendor_login );
        return $user;
    }
    catch (Illuminate\Database\QueryException $e){
        $error_code = $e->errorInfo[1];
        if($error_code == 1062){
            self::delete($lid);
            return 'houston, we have a duplicate entry problem';
        }
    }

Creating a new, nonexistant one : works perfectly.
However the try/catch block never seems to be reached since
I'm always getting laravels inbuild error site with the QueryException
for the duplicate entry on the users table. How can I make it work,
that on a duplicate entry it deletes the vendor it set before from the
table Vendor AND returns an error to display for the user?

转自:https://laracasts.com/discuss/channels/eloquent/eloquent-trycatch-on-duplicate-key-exception-and-delete

Laravel框架数据库CURD操作、连贯操作使用方法

Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力。

一、Selects

检索表中的所有行

$users = DB::table('users')->get();
foreach ($users as $user)
{
var_dump($user->name);
}

从表检索单个行

$user = DB::table('users')->where('name', 'John')->first();
var_dump($user->name);

检索单个列的行

$name = DB::table('users')->where('name', 'John')->pluck('name');

检索一个列值列表

$roles = DB::table('roles')->lists('title');

该方法将返回一个数组标题的作用。你也可以指定一个自定义的键列返回的数组

$roles = DB::table('roles')->lists('title', 'name');

 

指定一个Select子句

$users = DB::table('users')->select('name', 'email')->get();
$users = DB::table('users')->distinct()->get();
$users = DB::table('users')->select('name as user_name')->get();

Select子句添加到一个现有的查询

$query = DB::table('users')->select('name');
$users = $query->addSelect('age')->get();

where

$users = DB::table('users')->where('votes', '>', 100)->get();

Continue reading

PHP中的max_input_vars指令

今天接到客服部工作人员反馈的一个客户的问题,产品是允许用户添加一个产品属性的,而每个属性是由多个表单域组成 ,这样当每添加一个属性就等于添加了n个表单域,这个客户添加的非常的多,发现在提交保存的时候总是失败,提示其中一个表单元素的索引值不存在,经测试是发现服务端接收的一些表单域丢失了一部分。起初分析的是服务器接收的数据超出了php设置的max_post_size(其实当时已经设置了8M,足够使用了),修改了测试发现此问题仍然存在。后来将用户原来的一些添加的表单元素进行删除,再重新添加同样数据库表单域可以成功,但一旦超出一定数量的表单域就会发生丢失的情况,这个时候首先怀疑的是apache是否有类似限制接收隐藏域的指令,找了没有找到,紧接着在php中批到一个max_input_vars这个指令,意思就是说php中允许接收的最大表单域数据,到目前为止基本上是确定这个原因引起的了,奖其修改为2000,重启Apache,发现一切正常。

总结:提起php中的max_input_vars 估计很少人知道这个这个指令,因为他的使用场景实在是太少了,在php.ini中这个指令的定义是指服务端最大可以接收的表单域的数量多少,默认是1000,这足够我们平时使用了。但仍然有一些特殊的情况下需要修改此值的大小。

使用supervisord监控php脚本

官网:http://www.supervisord.org

一、安装supervisord

$brew install supervisord

在mac下安装要比linux下安装方便的多。

二、配置

修改/usr/local/etc/supervisord.ini文件,取消以下几行注释

[inet_http_server] ; inet (TCP) server disabled by default
port=127.0.0.1:9001 ; (ip_address:port specifier, *:port for all iface)
username=user ; (default is no username (open server))
password=123 ; (default is no password (open server))

这样就可以通过浏览器对进行管理了。

三、添加一个新应用

创建一个a.php文件,内容如下:

while(true){
echo 'a' . time() . "\r\n";
sleep(1);
}

然后在supervisord.ini文件中添加以下几行:

[program:php]
command=php /Users/sxf/web/a.php
autostart=true
autorestart=true
startsecs=1
startretries=3
redirect_stderr=true
stdout_logfile=/Users/sxf/web/supervisord.log
stderr_logfile=/Users/sxf/web/stderr.log

重启supervisord。

$brew services restart supervisord

打开浏览器http://127.0.0.9001,输入用户名和密码,可以看此进程,可以对每个进程进行停止,重启和刷新操作。

supervisord_php
对于supervisord命令请参考:http://blog.haohtml.com/archives/15145

按位与、或、异或等运算方法

按位与运算符(&)

参加运算的两个数据,按二进制位进行“与”运算。

运算规则:0&0=0;   0&1=0;    1&0=0;     1&1=1;

即:两位同时为“1”,结果才为“1”,否则为0

例如:3&5  即 0000 0011 & 0000 0101 = 0000 0001   因此,3&5的值得1。

另,负数按补码形式参加按位与运算。

“与运算”的特殊用途:

(1)清零。如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零的数值相与,结果为零。 

(2)取一个数中指定位

方法:找一个数,对应X要取的位,该数的对应位为1,其余位为零,此数与X进行“与运算”可以得到X中的指定位。

例:设X=10101110,

    取X的低4位,用 X & 0000 1111 = 0000 1110 即可得到;

    还可用来取X的2、4、6位。 

按位或运算符(|)

参加运算的两个对象,按二进制位进行“或”运算。

运算规则:0|0=0;   0|1=1;   1|0=1;    1|1=1;

 即 :参加运算的两个对象只要有一个为1,其值为1。

例如:3|5 即 0000 0011 | 0000 0101 = 0000 0111   因此,3|5的值得7。  

另,负数按补码形式参加按位或运算。

“或运算”特殊作用:

(1)常用来对一个数据的某些位置1。

方法:找到一个数,对应X要置1的位,该数的对应位为1,其余位为零。此数与X相或可使X中的某些位置1。

例:将X=10100000的低4位置1 ,用 X | 0000 1111 = 1010 1111即可得到。 

异或运算符(^)

参加运算的两个数据,按二进制位进行“异或”运算。

运算规则:0^0=0;   0^1=1;   1^0=1;   1^1=0;

即:参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。 

“异或运算”的特殊作用:

(1)使特定位翻转 找一个数,对应X要翻转的各位,该数的对应位为1,其余位为零,此数与X对应位异或即可。

例:X=10101110,使X低4位翻转,用X ^ 0000 1111 = 1010 0001即可得到。 

(2)与0相异或,保留原值 ,X ^ 0000 0000 = 1010 1110。

从上面的例题可以清楚的看到这一点。

取反运算符(~)

参加运算的一个数据,按二进制位进行“取反”运算。

运算规则:~1=0;   ~0=1;

即:对一个二进制数按位取反,即将0变1,1变0。 

使一个数的最低位为零,可以表示为:a&~1。

~1的值为1111111111111110,再按“与”运算,最低位一定为0。因为“~”运算符的优先级比算术运算符、关系运算符、逻辑运算符和其他运算符都高。

左移运算符(<<)

将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。

例:a = a << 2 将a的二进制位左移2位,右补0,

左移1位后a a * 2; 

若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2。

右移运算符(>>)

将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。

操作数每右移一位,相当于该数除以2。

例如:a = a >> 2 将a的二进制位右移2位,

左补0 or 补1 得看被移数是正还是负。

>> 运算符把 expression1 的所有位向右移 expression2 指定的位数。expression1 的符号位被用来填充右移后左边空出来的位。向右移出的位被丢弃。

例如,下面的代码被求值后,temp 的值是 -4:

-14 (即二进制的 11110010)右移两位等于 -4 (即二进制的 11111100)。

var temp = -14 >> 2

 无符号右移运算符(>>>)

>>> 运算符把 expression1 的各个位向右移 expression2 指定的位数。右移后左边空出的位用零来填充。移出右边的位被丢弃。

例如:var temp = -14 >>> 2

变量 temp 的值 -14 (即二进制的 11111111 11111111 11111111 11110010),向右移两位后等于 1073741820 (即二进制的 00111111 11111111 11111111 11111100)。

复合赋值运算符

位运算符与赋值运算符结合,组成新的复合赋值运算符,它们是:

&=    例:a &= b        相当于a=a & b

|=    例:a |= b        相当于a=a | b

>>=   例:a >>= b       相当于a=a >> b

<<= 例:a <<= b       相当于a=a << b

^=   例:a ^= b       相当于a=a ^ b

运算规则:和前面讲的复合赋值运算符的运算规则相似。

不同长度的数据进行位运算

如果两个不同长度的数据进行位运算时,系统会将二者按右端对齐,然后进行位运算。

以“与”运算为例说明如下:我们知道在C语言中long型占4个字节,int型占2个字节,如果一个long型数据与一个int型数据进行“与”运算,右端对齐后,左边不足的位依下面三种情况补足,

(1)如果整型数据为正数,左边补16个0。

(2)如果整型数据为负数,左边补16个1。

(3)如果整形数据为无符号数,左边也补16个0。

如:long a=123;int b=1;计算a & b。 

如:long a=123;int b=-1;计算a & b。 

如:long a=123;unsigned int b=1;计算a & b。

解决git clone时报错:The requested URL returned error: 401 Unauthorized while accessing的问题

版本问题,最直接的解决办法就是重新编辑安装git吧:

1. 下载:

wget -O git.zip https://github.com/git/git/archive/master.zip

2. 解压:

unzip git.zip

3. 进入git目录:

cd git-master

4. 编译安装:

autoconf
./configure --prefix=/usr/local
make && make install

5. 最后别忘了删掉旧的git,并把新版本的git建立软链接到/usr/bin/git

rm /usr/bin/git
ln -s /usr/local/bin/git /usr/bin/git