分类存档: Linux

PHP扩展Coreseek API

Coreseek API下载地址http://www.coreseek.cn/products-install/api-list/

$ wget http://pecl.php.net/get/sphinx-1.2.0.tgz
$ tar -zxvf sphinx-1.2.0.tgz
$ cd sphinx-1.2.0
$ /usr/local/php/bin/phpize
$ ./configure --with-php-config=/usr/local/php/bin/php-config
$ make && make install
#安装PHP扩展之前需要安装libsphinxclient
#报错信息:configure: error: Cannot find libsphinxclient headers
$ cd coreseek-3.2.14/csft-3.2.14/api/libsphinxclient
$ ./configure
$ make && make install
$ /usr/local/apache2/bin/apachectl restart

Coreseek全文索引配置及使用

Coreseek 是一款中文全文检索/搜索软件…(详情请见http://www.coreseek.cn

$ wget http://www.coreseek.cn/uploads/csft/3.2/coreseek-3.2.14.tar.gz
$ tar -zxvf coreseek-3.2.14.tar.gz

#安装mmseg
$ cd mmseg-3.2.14
$ ./bootstrap    #输出的warning信息可以忽略,如果出现error则需要解决
$ ./configure --prefix=/usr/local/mmseg3
$ make && make install
$ cd ..

#安装coreseek
$ cd coreseek-3.2.14
$ ./configure --prefix=/usr/local/sphinx --with-mysql --with-mmseg-includes=/usr/local/mmseg/include/mmseg --with-mmseg-libs=/usr/local/mmseg/lib/
$ make && make install

#把字典文件和mmseg.ini配置文件拷贝到相应的目录
$ cp uni.lib /usr/local/sphinx/dict/uni.lib
$ cp mmseg.ini/usr/local/sphinx/dict/mmseg.ini

#修改配置文件mmseg.ini和csft.conf
$ vim mmseg.ini
merge_number_and_ascii=1;
number_and_ascii_joint=-;
compress_space=0;
seperate_number_ascii=1;
#merge_number_and_ascii: 字母和数字连续出现是非切分 #number_and_ascii_joint:连接数字和字母可用的符号,如'-' '.' 等
#compress_space:暂时无效
#seperate_number_ascii:是否拆分数字,如 1988 -> 1/x 9/x 8/x 8/

$ vim csft.conf
source src1
{
        type = mysql  

        sql_host = localhost
        sql_user = root
        sql_pass = 123456
        sql_db = dbTest
        sql_port = 3306  # optional, default is 3306  

        sql_query = select id, content, addtime, reason, flag from tbLog  

        sql_attr_uint = id
        sql_attr_timestamp = addtime

        sql_query_info = SELECT * FROM tbLog WHERE id=$id
}

index test1
{
        source = src1
        path = /data/sphinx/data
        docinfo = extern
        charset_type = sbcs
        charset_dictpath = /usr/local/sphinx/dict
}  

indexer
{
        mem_limit = 32M
}  

searchd
{
        port = 9312
        log = /data/sphinx/log/searchd.log
        query_log = /data/sphinx/log/query.log
        read_timeout = 5
        max_children = 30
        pid_file = /data/sphinx/log/searchd.pid
        max_matches = 1000
        seamless_rotate = 1
        preopen_indexes = 0
        unlink_old = 1
}

#生成index
$ /usr/local/sphinx/bin/indexer --config /usr/local/sphinx/etc/csft.conf --all

#启动daemon
$ /usr/local/sphinx/bin/searchd --config /usr/local/sphinx/etc/csft.conf

#关闭服务
$ /usr/local/sphinx/bin/searchd --config /usr/local/sphinx/etc/csft.conf --stop

#启动之后如果更新索引要加rotate参数
#/usr/local/sphinx/bin/indexer --config /usr/local/sphinx/etc/csft.conf --all --rotate

#测试
$ /usr/local/sphinx/bin/search 'test'

Apache 添加模块 gzip配置

由于在编译apache时没有加一些参数,只能另外添加安装:

$ cd /data/super/httpd-2.2.21/modules/filters
$ /usr/local/apache2/bin/apxs -i -c -a mod_deflate.c
$ cd /data/super/httpd-2.2.21/modules/metadata
$ /usr/local/apache2/bin/apxs -i -a -c mod_headers.c
$ ls /usr/local/apache2/modules
httpd.exp  libphp5.so  mod_deflate.so  mod_headers.so

apxs命令参数说明:
-i 此选项表示需要执行安装操作,以安装一个或多个动态共享对象到服务器的modules目录中。
-a 此选项自动增加一个LoadModule行到httpd.conf文件中,以激活此模块,或者,如果此行已经存在,则启用之。
-A 与 -a 选项类似,但是它增加的LoadModule命令有一个井号前缀(#),即此模块已经准备就绪但尚未启用。
-c 此选项表示需要执行编译操作。它首先会编译C源程序(.c)files为对应的目标代码文件(.o),然后连接这些目标代码和files中其余的目标代码 文件(.o和.a),以生成动态共享对象dsofile 。如果没有指定 -o 选项,则此输出文件名由files中的第一个文件名推测得到,也就是默认为mod_name.so 。

Ps:如果是新安装apache,参数加上 –enable-headers –enable-deflate 就可以了

开启gzip压缩配置

$ vim /usr/local/apache2/conf/httpd.conf
LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
<IfModule mod_deflate.c>
        DeflateCompressionLevel 3  # 压缩程度的等级
        AddOutputFilterByType DEFLATE text/html text/plain text/css text/xml text/javascript
        AddOutputFilter DEFLATE css js
        SetOutputFilter DEFLATE  # 插入过滤器
        # 不压缩图片等格式文件
        SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary
        SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
        SetEnvIfNoCase Request_URI .(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary
</IfModule>

socks5 代理

安装:

$ wget http://jaist.dl.sourceforge.net/sourceforge/ss5/ss5-3.8.9-6.tar.gz
$ tar -zxf ss5-3.8.9-6.tar.gz
$ cd ss5-3.8.9-6
$ ./configure
$ make
$ make install

配置:

$ vim /etc/opt/ss5/ss5.conf  #先把原来的ss5.conf配置文件备份了(注释太多),新建一个ss5.conf
auth    0.0.0.0/0       -       u  #- u是需要认证的ss5;- -是无需认证的ss5
permit  u       0.0.0.0/0       -       0.0.0.0/0       -       -       -     -
$ vim /etc/opt/ss5/ss5.passwd
test 123456
$ ss5 -t  #启动ss5
$ netstat -antup | grep ss5  #查看端口;默认端口号:1080,改ss5端口ss5  -b ip地址:端口

遇到问题:
1.ss5 ld returned 1 exit status
解决:export EXTRA_LIBS=’-lcrypto’,然后再./configure => make => make install

2.can’t unlink pid file /var/run/ss5/ss5.pid
解决:这是因为已经有ss5在运行,ps -ef | grep ss5,再kill掉它,再ss5 -t;

参考网站:
http://ss5.sourceforge.net/

Linux FTP 安装与配置

安装与配置:

$ apt-get install vsftpd
$ service vsftpd start #重启restart;停止stop
$ vim /etc/vsftpd.conf
anonymous_enable=YES #是否允许anonymous登录FTP服务器,默认是允许的
anon_upload_enable=YES #允许匿名上传
anon_mkdir_write_enable=YES #允许匿名用户建立文件夹
local_enable=YES #是否允许本地用户登录FTP服务器,默认是允许
write_enable=YES #是否允许用户具有在FTP服务器文件中执行写的权限,默认是允许
local_umask=022 #设置本地用户的文件生成掩码为022,默认是077
xferlog_enable=YES #启用上传和下载日志功能
connect_from_port_20=YES #启用FTP数据端口的连接请求
listen=YES #使vsftpd 处于独立启动模式

#当chroot_local_user=NO、chroot_list_enable=YES时,vsftpd.chroot_list中用户为锁定用户,即他们除了自己的目录,不可以访问其他目录。
chroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list #vsftpd.chroot_list是没有创建的需要自己添加,要想控制帐号就直接在文件中加帐号即可(一行一个用户帐号)

#添加ftp用户
$ useradd -g ftp -d /var/www/test/ -s /bin/false ftptest #-g ftp指定该用户到ftp组;-s /bin/false该用户不能登录系统
$ passwd ftptest #设置密码
$ chown -R root.ftp /var/www/test/
$ chmod 775 /var/www/test/ -R

遇到问题:
1.在passwd更改密码时,出现:passwd: Authentication token manipulation error,导致无法更改用户密码
解决办法:mount -rw -o remount /

2.530 Login incorrect
解决办法:
vim /etc/shells
增加一行:/bin/false

为phpMyAdmin 增加安全口令

由于phpMyAdmin没有设置口令,任何人都可以控制数据库,所以增加一个安全口令,提高安全性。

$ vim /usr/local/apache2/conf/http.conf
#增加以下配置
<Directory "/var/www/html/phpMyAdmin">
    Options Includes FollowSymLinks
    AllowOverride all
    Allow from all
        AuthName "Administrator Auth"
        AuthType Basic
        AuthUserFile /etc/superzc.pwd
        require valid-user
    Order allow,deny
</Directory>
#增加用户以及密码
$ /usr/local/apache2/bin/htpasswd -c /etc/superzc.pwd superzc
password:  #输入安全口令的密码
$ /usr/local/apache2/bin/apachectl restart

重启apache之后,访问phpMyAdmin,搞定~已经需要安全验证。

Python SocketServer

这几天在搞2台服务器同步文件的问题,由于公司文件传送限制用户权限,导致写好的传送脚本scp.exp用apache用户无法执行脚本同步。所以另外想办法,参照相关文档用python写了一个SocketServer,在后台跑然后接受php的命令去执行脚本($ nohup python server.py > nohup.out &或者$ python server.py &,然后#exit,再ssh登陆,查看后台进程#ps -ef | grep py,能查到server.py的进程就OK了。)
server端:server.py

import os
import SocketServer
class MyHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        while 1:
            dataReceived = self.request.recv(1024)
            if not dataReceived: break
            #self.request.send(dataReceived)
            #print dataReceived
            if dataReceived == 'cmd=1':
                os.system('/home/cgi/scp.exp')
                self.request.send(dataReceived+'&result=1\n')
            else:
                self.request.send(dataReceived+'&result=0\n')
myServer = SocketServer.ThreadingTCPServer(('localhost',6000), MyHandler)
myServer.serve_forever()

client端:client.py

import socket
remote_host = '127.0.0.1'
remote_port = 6000
send_buf = raw_input()
#send_buf = open('test.txt', 'rb').read()
#send_buf = send_buf.replace('\x0D\x0A', '')
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((remote_host, remote_port))
sock.send(send_buf)
response_data = sock.recv(1024)
print response_data
sock.close()

或者用PHP写client端:client.php

$fp = fsockopen("127.0.0.1", 6000, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";exit;
} else {
    $out = "cmd=1";
    fwrite($fp, $out);
    while (!feof($fp)) {
        $str .= fgets($fp, 4096);
    if(strpos($str, "\n") !== FALSE){
        if(strpos($str, "&result=1") != FALSE){
            break;
        }else{
    }
    }
}
fclose($fp);

启动apache 报错:libphp5.so:undefined symbol: zend_parse_parameters

今天在PHP扩展ssh2的时候,重启apache时候,发现报错,网上找了好久资料,一种是关闭selinux,怕安全性问题没这么做,后来又找到了一个解决方案(http://www.linuxforums.org/forum/red-hat-fedora-linux/87975-configuring-php-work-apache.html),如下:

$ /usr/local/apache2/bin/apachectl start
httpd: Syntax error on line 203 of /etc/httpd/conf/httpd.conf: Cannot load /usr/lib/httpd/modules/libphp5.so into server: /usr/lib/httpd/modules/libphp5.so: undefined symbol: zend_parse_parameters

解决方法:
首先,安装bison,bison 是替代yacc的语法分析程序生成器。

$ wget http://ftp.gnu.org/gnu/bison/bison-2.5.tar.gz
$ tar -zxvf bison-2.5.tar.gz
$ cd bison-2.5
$ ./configure
$ make
$ make install

然后,重新编译php

$ make install distclean
$ /usr/local/apache2/bin/apachectl start

Linux Mysql常用命令

连接Mysql
1、本地连接
mysql -uroot -p123456
2、远程连接
mysql -h110.110.110.110 -uroot -p123456
//连接host为110.110.100.100的服务器,数据库用户名为root,密码为123456的机器,回车即可进入到MYSQL中了,MYSQL的提示符是: mysql>

操作Mysql
1、显示数据库列表。
show databases;
2、显示库中的数据表:
use mysql; //打开库
show tables;
3、显示数据表的结构:
describe 表名;
4、建库:
create database 库名;
5、建表:
use 库名;
create table 表名(字段设定列表);
6、删库和删表:
drop database 库名;
drop table 表名;
7、将表中记录清空:
delete from 表名;
8、显示表中的记录:
select * from 表名;
9、导出数据库和表:
mysqldump -hhost -uuser -ppass –databases dbname > file.sql //不是在mysql>状态下执行
10、增加新用户:
grant select on 数据库.* to 用户名@登录主机 identified by “密码”
如增加一个用户test密码为123,让他可以在任何主机上登录, 并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入mysql,然后键入以下命令:
grant select,insert,update,delete on *.* to ” Identified by “123″;
增加所有权限命令:
GRANT ALL PRIVILEGES ON *.* TO ‘root’@'%’ IDENTIFIED BY ’123456′;
11、刷新权限:
FLUSH PRIVILEGES;
12、查看创建表的SQL语句:
SHOW CREATE TABLE table_name;
13、查看表状态(已用空间等):
SHOW TABLE STATUS LIKE ‘Login’\G
*************************** 1. row ***************************
Name: Login
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 31687398
Avg_row_length: 110
Data_length: 3494789120
Max_data_length: 0
Index_length: 1858551808
Data_free: 67802905968640
Auto_increment: NULL
Create_time: NULL
Update_time: NULL
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options: partitioned
Comment: NULL
1 row in set (28.03 sec)

[转]利用php调用C语言 扩展函数

第一步. 生成需要调用的so文件

1. 首先做一个简单的so文件:

/** * hello.c
* To compile, use following commands:
*   gcc -O -c -fPIC -o hello.o hello.c
*   gcc -shared -o libhello.so hello.o
*/
int hello_add(int a, int b)
{
return a + b;
}

然后将它编译成.so文件并放到系统中:

$ gcc -O -c -fPIC -o hello.o hello.c #-fPIC:是指生成的动态库与位置无关;假如是c++程序,用g++  -O -c -fPIC -o hello.o hello.c
$ gcc -shared -o libhello.so hello.o #-shared:是指明生成动态链接库;假如需要编译多个文件:g++ a.h b.cpp -fPIC -shared -o libtest.so
$ cp libhello.so /usr/local/lib #把生成的链接库放到指定的地址
$ echo /usr/local/lib > /etc/ld.so.conf.d/local.conf #把库地址写入到配置文件中
$ /sbin/ldconfig #用此命令,使刚才写的配置文件生效

2. 写段小程序来验证其正确性:

/**
* hellotest.c
* To compile, use following commands:
*   gcc -o hellotest -lhello hellotest.c
*/
#include <stdio.h>
int main()
{
int a = 3, b = 4;
printf("%d + %d = %d", a, b, hello_add(a,b));
return 0;
}

编译并执行:

$ gcc -o hellotest -lhello hellotest.c #编译测试文件,生成测试程序
$ ./hellotest #运行测试程序

第二步. 制作PHP模块(外部模块)

请确保你已安装 PHP及APACHE服务器。

$ cd php-5.2.3/ext

1. 然后通过下面的命令用ext_skel脚本建立一个名为 hello 的模块:

$ ./ext_skel --extname=hello

2. 执行该命令之后它会提示你应当用什么命令来编译模块,可惜那是将模块集成到php内部的编译方法。

如果要编译成可动态加载的 php_hello.so,方法要更为简单。

$ cd hello

首先编辑 config.m4 文件,去掉第16行和第18行的注释(注释符号为 dnl 。)

16: PHP_ARG_ENABLE(hello, whether to enable hello support,

17: dnl Make sure that the comment is aligned:

18: [ --enable-hello Enable hello support])

3. 然后执行 phpize 程序,生成configure脚本:

$ phpize

该程序在ubuntu的php5-dev包中

4. 打开 php_hello.h,在 PHP_FUNCTION(confirm_hello_compiled); 之下加入函数声明:

PHP_FUNCTION(confirm_hello_compiled); /* For testing, remove later. */

PHP_FUNCTION(hello_add);

5. 打开 hello.c,在 PHP_FE(confirm_hello_compiled, NULL) 下方加入以下内容。

zend_function_entry hello_functions[] = {

PHP_FE(confirm_hello_compiled, NULL) /* For testing, remove later. */

PHP_FE(hello_add, NULL) /* For testing, remove later. */

{NULL, NULL, NULL} /* Must be the last line in hello_functions[] */};

然后在 hello.c 的最末尾书写hello_add函数的内容:

PHP_FUNCTION(hello_add)

{

long int a, b;

long int result;

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, “ll”, &a, &b) == FAILURE) {

return;

}

result = hello_add(a, b);

RETURN_LONG(result);}保存退出,编译并安装。

表: zend_parse_parameters() 字母对应的类型

类型 字母 变量类型
Boolean b zend_bool
Long l long
Double d double
String s char *, int
Resource r zval *
Array a zval *
Object o zval*
zval z zval*

6. 编译

$ ./configure
#此处由于php-config的路径问题报错,解决方法:./configure --with-php-config=/usr/local/php/bin/php-config
$ make LDFLAGS=-lhello
$ sudo make install #编译生成了php扩展模块
Installing shared extensions: /usr/lib/php5/20060613
$ cp modules/hello.so /usr/lib/php/modules
$ vim /usr/local/php/lib/php.ini
#enable_dl = Off;允许dl()动态加载so扩展功能enable_dl = On
#增加一条:extension=hello.so
$ /usr/local/apache2/bin/apachectl restart

然后在 /var/www/html 下建立一个 hello.php 文件,内容如下:

<?php
dl("hello.so");
echo hello_add(3, 4);
?>

然后在浏览器中打开hello.php文件,如果显示7,则说明函数调用成功了。

第三步. 制作PHP模块(内部模块)

另外可以在apache重启的时候让我们的so库直接动态编译进php5,就像linux的insmod hello.ko模块一样,不用dl加载也不用重新编译php,就可以直接使用so的函数了,步骤如下:

$ vim /etc/php5/apache2/php.ini
#enable_dl = Off
#增加一条:extension=hello.so
$ /usr/local/apache2/bin/apachectl restart

不能reload而必须restart apache,这样so就像insmod hello.ko一样被融到了php5内核,然后代码就可以忽略掉dl(“hello.so”);了,
[注意,这种方式只适合hello.so库内所有功能代码已经全部调试ok,如果还处在调试期间,那么需要采用上面的dl强制加载的方式]

代码如下:

<?php
echo hello_add(3, 4);
?>

但是该功能不太适合调试,因为每次修改hello.so中代码的话,都需要让service apache restart重启才能让php5内核再次加载新的hello.so扩展.可以这样定义hello.so的实现,这样每次执行.php网页,都会在 /var/www/下建立一个文件夹,所以php扩展实现了

第 1 页,共 2 页12