标签:PHP

0

3064

php的socket编程中socket_recv函数的应用

这两天在研究golang与php之间以socket通信,golang作为服务端,php作为客户端。

当传递普通数据时,php以socket_read接受数据一点问题都没有,但当服务端发送一张图片(二进制流)时,就会出现问题。

查看文档才发现,socket_read($socket, $len, PHP_NORMAL_READ)的第三参数不对,PHP_NORMAL_READ是用来接受字符数据,要改成PHP_BINARY_READ才能接收二进制流。

果断改成socket_read($socket, $len, PHP_BINARY_READ)后,然后再抛出到浏览器,果然可以显示图片了,兴奋了一下,但又发现了问题:浏览器显示图片时不时只显示一部分就断了。

图片随机性的只显示一部分,检查了流程都没问题。最后还是查官方文档,终于发现socket_recv函数:

(PHP 4 >= 4.1.0, PHP 5)
socket_recv — Receives data from a connected socket

说明

int socket_recv ( resource $socket , string &$buf , int $len , int $flags )
The socket_recv() function receives len bytes of data in buf from socket. socket_recv() can be used to gather data from connected sockets. Additionally, one or more flags can be specified to modify the behaviour of the function.

buf is passed by reference, so it must be specified as a variable in the argument list. Data read from socket by socket_recv() will be returned in buf.

其中,最后一个参数$flags要特别注意,先记录如下,以备国人知晓:

0x1 :数据应该带外发送,所谓带外数据就是TCP紧急数据

0x2 :使有用的数据复制到缓冲区内,但并不从系统缓冲区内删除。

0x4 :不要将包路由出去。

0x8 :数据完整记录

0x100 :数据完整处理

我从socket_recv($socket, $buf, $len, 0x1)一直测试到socket_recv($socket, $buf, $len, 0x100),最终确定用0x100才可以。

OK,问题解决了。

乐果   发表于   2015 年 01 月 24 日 标签:PHP 继续阅读

3

6345

php的pack函数应用

如题,最近在用PHP写socket的客户端,用到了pack函数。因此记录下:

    /**
     * 测试链路是否能正常通信
     * @author      liuxiang <unphp@qq.com>
     * @date        2015-01-22
     * @return boolean
     */
    public function ping()
    {
        $pool = $this->_pool;
        $sendData = pack('A60', 'ping');
        $sendCount = $this->fiexLenInfo($sendData);
        $command = pack('a10', $sendCount) . $sendData;
        socket_write($pool, $command, strlen($command));
        $len_buff = @socket_read($pool, 10, PHP_NORMAL_READ);
        $len = (int) trim($len_buff);
        if ($len >= 5 && '200' === trim(@socket_read($pool, 5, PHP_NORMAL_READ)))
        {
            return true;
        }
        return false;
    }

    /**
     * 请求socket服务接口
     * @author      liuxiang <unphp@qq.com>
     * @date        2014-12-26
     * @param type $address   调用的接口名(内部路由地址)
     * @param type $data      发送的数据
     * @return type
     */
    public function send($address, $data = '')
    {
        $pool = $this->connect();
        $sendData = pack('A60', $address) . $data;
        $sendCount = $this->fiexLenInfo($sendData);
        $command = pack('a10', $sendCount) . $sendData;
        socket_write($pool, $command, strlen($command));
        $len_buff = @socket_read($pool, 10, PHP_NORMAL_READ);
        $len = (int) trim($len_buff);
        if ($len >= 5)
        {
            $code = @socket_read($pool, 5, PHP_NORMAL_READ);
            $rp = 5 === $len ? '' : @socket_read($pool, $len - 5, PHP_NORMAL_READ);
            $rs = new coreServerResult($code, $rp);
            return $rs;
        }
        else
        {
            App::error('服务返回数据异常!', 50003);
        }
        return null;
    }

乐果   发表于   2015 年 01 月 22 日 标签:PHP 继续阅读

0

3636

xapian安装(PHP版)

1、scws安装

sudo wget http://www.xunsearch.com/scws/down/scws-1.2.2.tar.bz2
sudo tar -jxvf scws-1.2.2.tar.bz2
cd scws-1.2.2/
./configure --prefix=/usr/local/scws
sudo make && make install
sudo mkdir /usr/include/scws
ln -sf /usr/local/scws/include/scws /usr/include
sudo ln -s /usr/local/scws/lib/libscws.so.1.1.0 /usr/lib/libscws.so
sudo ln -s /usr/local/scws/lib/libscws.so.1.1.0 /usr/lib/libscws.so.1

安装scws扩展 cd phpext phpize ./configure –with-php-config=PHP_HOME/bin/php-config make make install

下载分词库

http://www.xunsearch.com/scws/down/scws-dict-chs-utf8.tar.bz2
sudo tar -jxvf scws-dict-chs-utf8.tar.bz2
cd scws-dict-chs-utf8
sudo mv dict.utf8.xdb /usr/local/scws/

2、安装xapian核心服务

sudo wget http://oligarchy.co.uk/xapian/1.2.17/xapian-core-1.2.17.tar.xz
sudo xz -d xapian-core-1.2.17.tar.xz
sudo tar xvf xapian-core-1.2.17.tar
cd xapian-core-1.2.17
sudo ./configure –prefix=/usr/local/xapian  

如果 报错:

configure: error: Neither uuid/uuid.h nor uuid.h found - required for brass, chert and flint (you may need to install the uuid-dev, libuuid-devel or e2fsprogs-devel package)

ubuntu环境下安装依赖库即可:

sudo apt-get install uuid-dev 

报错:

You need a working C++ compiler to compile Xapian
....
xapian ./configure CXX=/opt/bin/c++

ubuntu环境下安装依赖库即可:

sudo apt-get install g++

3、安装xapian客户端(php扩展)

sudo wget http://oligarchy.co.uk/xapian/1.2.17/xapian-bindings-1.2.17.tar.xz
sudo xz -d xapian-bindings-1.2.17.tar.xz
sudo tar xvf xapian-bindings-1.2.17.tar
cd xapian-bindings-1.2.17
sudo ./configure XAPIAN_CONFIG=/usr/local/xapian/bin/xapian-config --with-php PHP_CONFIG=/opt/service/php/bin/php-config

乐果   发表于   2014 年 11 月 29 日 标签:xapianPHPubuntu 继续阅读

0

2704

ubuntu下编译安装php

先安装必须的依赖库:

sudo apt-get install autoconf
sudo apt-get install libxml2-dev
sudo apt-get install bzip2
sudo apt-get install libcurl3-openssl-dev
sudo apt-get install libcurl4-gnutls-dev
sudo apt-get install libjpeg-dev
sudo apt-get install libpng-dev
sudo apt-get install libxpm-dev
sudo apt-get install libfreetype6-dev
sudo apt-get install libt1-dev
sudo apt-get install libmcrypt-dev
sudo apt-get install libmysql++-dev
sudo apt-get install libxslt1-dev 
sudo apt-get install libbz2-dev

开始编译安装:

sudo ./configure \
--prefix=/data/service/php53 \
--with-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-config-file-path=/data/service/php/etc \
--with-zlib \
--with-curl \
--with-curlwrappers \
--with-mcrypt \
--with-gd \
--with-openssl \
--with-mhash \
--with-xmlrpc \
--with-jpeg-dir \
--with-png-dir \
--with-xpm-dir \
--with-freetype-dir \
--with-zlib-dir \
--enable-shared \
--enable-fpm \
--enable-xml \
--disable-rpath \
--enable-safe-mode \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--enable-mbregex \
--enable-mbstring \
--enable-gd-native-ttf \
--enable-pcntl \
--enable-sockets \
--enable-zip \
--enable-soap 

##...过程省略

sudo make && sudo make install

ubuntu可能需要的步骤—软链接库文件:

cd /usr/lib
ln -s /usr/lib/x86_64-linux-gnu/libXpm.so .
ln -s /usr/lib/x86_64-linux-gnu/libXpm.a .
ln -s /usr/lib/x86_64-linux-gnu/libXpm.so.4 .
ln -s /usr/lib/x86_64-linux-gnu/libXpm.so.4.11.0 .

需要注意的

有可能因为系统缺少libiconv依赖库libiconv依赖库的路径不对,导致在make或make install步骤中报错。 此时,因检查系统中是否存在libiconv.so等动态库,

    find /usr -name libiconv.so

确定缺少该依赖库时,则下载安装。例如下载了libiconv-1.13.1版本时,安装步骤如下:

cd libiconv-1.13.1
./configure --prefix=/usr/local/lib/libiconv-1.13.1
sudo make
sudo make install

最后重新编译安装php,编译安装前先清除下:

    sudo make clean

在configure参数中加入iconv依赖库的路径

    --with-iconv=/usr/local/lib/libiconv-1.13.1

可能容易出现的报错:

configure: error: freetype.h not found.

freetype明明是使用apt-get安装了的。也可以查询到这个文件 但是就是不行

root@ubuntu:/c2ms/packages/php-5.3.28# cat configure |grep freetype.h      if test -f "$i/include/freetype2/freetype/freetype.h"; then
      { echo "configure: error: freetype.h not found." 1>&2; exit 1; }
      if test -f "$i/include/freetype2/freetype/freetype.h"; then
      { echo "configure: error: freetype.h not found." 1>&2; exit 1; }

结果我按照这个路径查找,果然没这个文件 ubuntu安装的目录文件只是这个:

include/freetype2/freetype.h 

所以

ln -sf /usr/include/freetype2 /usr/include/freetype2/freetype

下次记得cat 不要太相信源码了

乐果   发表于   2014 年 11 月 25 日 标签:ubuntuPHP 继续阅读

0

2036

PHP安装taint扩展(linux平台下)

先到相关站点下载扩展包文件http://www.php.net/manual/zh/taint.configuration.php

解压后,将taint-1.2.1放到php编译安装的源目录下的ext目录下。

例如我的php编译安装时的源在/home/xiao/soft/php-5.4.10,

就将解压的taint-1.2.1放在/home/xiao/soft/php-5.4.10/ext目录下。

然后编译执行过程记录如下:

xiao-M68MT-S2P taint-1.2.1 # cd /home/xiao/soft/php-5.4.10/ext/taint-1.2.1
xiao-M68MT-S2P taint-1.2.1 # phpize
Configuring for:
PHP Api Version:         20090626
Zend Module Api No:      20090626
Zend Extension Api No:   220090626

......

乐果   发表于   2014 年 11 月 14 日 标签:PHP 继续阅读

较旧的文章 较新的文章
热评文章