Centos6.6下编译安装最新apache

转载地址:http://www.linuxprobe.com/centos66-make-apache.html
安装编译环境
安装开发工具组
yum groupinstall 'Development tools'
仅安装需要的工具

因我的虚拟机是mini安装,配置aliyun的yum源家里小水管下载慢,就只装个gcc好了。

yum install gcc
下载源码包
下载最新版httpd

下载地址:http://httpd.apache.org/download.cgi#apache24

写此篇文章时最新版本为:httpd-2.4.27

在Centos6.6下编译安装最新apache在Centos6.6下编译安装最新apache

如果默认镜像下载太慢的话,可以在红框内选择其他国内镜像。

执行如下命令将源码包下载至Linux中并解压

wget https://mirrors.tuna.tsinghua.edu.cn/apache//httpd/httpd-2.4.27.tar.gz
tar -xf httpd-2.4.27.tar.gz
下载apr及apr-util

apr是Apache Portable Runtime的缩写,中文译为Apache可移植运行环境,是httpd所必须的,apr-util同理。

apr及apr-util下载地址:http://apr.apache.org/download.cgi

执行如下命令:

wget https://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-1.6.2.tar.gz
wget https://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-util-1.6.0.tar.gz
tar -xf apr-1.6.2.tar.gz
tar -xf apr-util-1.6.0.tar.gz

着手编译

首先编译apr
cd apr-1.6.2
./configure --prefix=/usr/local/apr16  //指定安装位置
make && make install
编译apr-util
cd apr-util-1.6.0
./configure --with-apr=/usr/local/apr16/ --prefix=/usr/local/apr16-util  //指定apr所在目录及apr-util安装目录
make && make install

在这里会报一个错,如下所示

xml/apr_xml.c:35:19: error: expat.h: No such file or directory   //注意这一行,提示没有expat.h这个头文件
xml/apr_xml.c:66: error: expected specifier-qualifier-list before ‘XML_Parser’
......强行省略.....
xml/apr_xml.c: In function ‘do_parse’:
xml/apr_xml.c:434: error: ‘apr_xml_parser’ has no member named ‘xp’
.....不要看我......
xml/apr_xml.c:500: error: ‘apr_xml_parser’ has no member named ‘xp_err’
make[1]: *** [xml/apr_xml.lo] Error 1
make[1]: Leaving directory `/root/apr-util-1.6.0'
make: *** [all-recursive] Error 1

expat是解析XML的程序,是不是想立马执行yum install expat-devel呢?

然而我可以告诉你,然并卵!

不管是base库中的2.0版还是epel库中的2.1版在后面编译httpd的时候都会报错!

所以,我们去expat的官网去下载最新版的expat。

cd ~
wget https://nchc.dl.sourceforge.net/project/expat/expat/2.2.3/expat-2.2.3.tar.bz2
tar -xf expat-2.2.3.tar.bz2
cd expat-2.2.3
./configure --prefix=/usr/local/expat23
make && make install

现在可以重新编译apr-util了

cd ~
cd apr-util-1.6.0
./configure --with-apr=/usr/local/apr16/ --with-expat=/usr/local/expat23/ --prefix=/usr/local/apr16-util
make clean //因执行过一次编译了,保险起见把那些编译出来的东东删掉,虽然理论上并不影响
make && make install
编译httpd
cd ~
cd httpd-2.4.27
./configure --prefix=/usr/local/httpd24 --sysconfdir=/etc/httpd24 --with-mpm=prefork --enable-mpms-shared=all --enable-mods-shared=most --with-apr=/usr/local/apr16 --with-apr-util=/usr/local/apr16-util/

到这一步会报错,提示我们没有装pcre,报错如下:

configure: error: pcre-config for libpcre not found. PCRE is required and available from http://pcre.org/

执行yum install pcre-devel即可

./configure --prefix=/usr/local/httpd24 --sysconfdir=/etc/httpd24 --with-mpm=prefork --enable-mpms-shared=all --enable-mods-shared=most --with-apr=/usr/local/apr16 --with-apr-util=/usr/local/apr16-util/
make && make install

下面解释一下所用的选项:

  • –prefix=/usr/local/httpd24 :配置安装目录不用多说了吧?
  • –sysconfdir=/etc/httpd24:指定配置文件存放目录,默认存放到安装目录下
  • –with-mpm=prefork:默认mpm为prefork
  • –enable-mpms-shared=all:将所有mpm编译为.so模块
  • –enable-mods-shared=most:编译大多数模块为.so文件
  • –with-apr=/usr/local/apr16:指定apr所在目录
  • –with-apr-util=/usr/local/apr16-util/ : 指定apr-util所在目录

更多的./configure脚本选项请参考:http://httpd.apache.org/docs/2.4/programs/configure.html

测试新版httpd

首先将httpd2.4.27的bin目录加到PATH环境变量中以便执行命令~

echo "export PATH=$PATH:/usr/local/httpd24/bin" >> /etc/profile.d/httpd.sh
source /etc/rc.local

简单执行下面命令开启服务并测试:

apachectl start

打开浏览器–>访问192.168.123.233–>看到如下图说明安装成功

在Centos6.6下编译安装最新apache在Centos6.6下编译安装最新apache

上文所指报错

好吧,我没重现出错误情景….

如遇到类似如下报错,可自行编译expat

libaprutil-1.so: undefined reference to `XML_GetErrorCode'
新增编译时没有启用的模块
1. 进入apache源代码的modules/proxy目录
2. 运行如下命令自动编译、安装和修改httpd.conf文件,激活mod_proxy模块:
apachepath/bin/apxs -c -i -a mod_proxy.c proxy_util.c
apachepath/bin/apxs -c -i -a mod_proxy_http.c proxy_util.c
选项说明:
-c 执行编译操作
-i 安装操作,安装一个或多个动态共享对象到服务器的modules目录
-a 自动增加一个LoadModule行到httpd.conf文件,以激活此模块,若此行存在则启用之
-A 与-a类似,但是它增加的LoadModule行前有井号前缀(#)
-e 需要执行编辑操作,可与-a和-A选项配合使用,与-i操作类似,修改httpd.conf文件,但并不安装此模块
3. 重启apache。

PHP多版本共存:php5.6与php5.5共存

续:
php多版本共存,需要使用php-fpm来运行php方便,这样更方便配置和管理
准备工作:
创建PHP5.6的相关目录,不要与已安装的php5.5的目录相同

mkdir /alidata/server/php56  安装目录 
mkdir /alidata/server/php56/etc      配置文件存放目录

源码包下载:

wget http://cn2.php.net/distributions/php-5.6.30.tar.gz

解压,编译安装php

tar xvf php-5.6.30.tar.gz
cd php-5.6.30
所有配置参数与上一个php5.5的完全相同,只有安装的目录和配置文件目录不同。
./configure \
--prefix=/alidata/server/php56 \
--with-config-file-path=/alidata/server/php56/etc \
--with-apxs2=/alidata/server/httpd/bin/apxs \
--enable-inline-optimization \
--disable-debug \
--disable-rpath \
--enable-shared \
--enable-opcache \
--enable-fpm \
--with-fpm-user=www \
--with-fpm-group=www \
--with-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-gettext \
--enable-mbstring \
--with-iconv \
--with-mhash \
--with-openssl \
--enable-bcmath \
--enable-soap \
--with-libxml-dir \
--enable-pcntl \
--enable-shmop \
--enable-sysvmsg \
--enable-sysvsem \
--enable-sysvshm \
--enable-sockets \
--with-curl \
--with-zlib \
--enable-zip \
--with-bz2 \
--with-gd \
--without-sqlite3 \
--without-pdo-sqlite \
--with-pear \
--with-freetype-dir=/usr/local/freetype.2.1.10 \
--with-jpeg-dir=/usr/local/jpeg.6

make && make install

若编译安装时遇到如下错误

/usr/local/src/php-5.3.10/ext/xmlrpc/libxmlrpc/encodings.c:73: undefined reference to `libiconv_open’ /usr/local/src/php-5.3.10/ext/xmlrpc/libxmlrpc/encodings.c:81: undefined reference to `libiconv’ /usr/local/src/php-5.3.10/ext/xmlrpc/libxmlrpc/encodings.c:101: undefined reference to `libiconv_close’ collect2: ld returned 1 exit status make: *** [sapi/fpm/php-fpm] 错误
在执行完 ./configure … 之后,修改下 Makefile,找到其中的
EXTRA_LIBS = -lcrypt -lz -lcrypt -lrt -lmysqlclient -lmcrypt -lldap -llber -lfreetype -lpng -lz -ljpeg -lcurl -lz -lrt -lm -ldl -lnsl -lrt -lxml2 -lz -lm -lssl -lcrypto -ldl -lz -lcurl -ldl -lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err -lidn -lssl -lcrypto -lz -lxml2 -lz -lm -lssl -lcrypto -ldl -lz -lxml2 -lz -lm -lxml2 -lz -lm -lcrypt -lxml2 -lz -lm -lxml2 -lz -lm -lxml2 -lz -lm -lxml2 -lz -lm -lcrypt
在最后面添加 -liconv ,修改后如下
EXTRA_LIBS = -lcrypt -lz -lcrypt -lrt -lmysqlclient -lmcrypt -lldap -llber -lfreetype -lpng -lz -ljpeg -lcurl -lz -lrt -lm -ldl -lnsl -lrt -lxml2 -lz -lm -lssl -lcrypto -ldl -lz -lcurl -ldl -lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err -lidn -lssl -lcrypto -lz -lxml2 -lz -lm -lssl -lcrypto -ldl -lz -lxml2 -lz -lm -lxml2 -lz -lm -lcrypt -lxml2 -lz -lm -lxml2 -lz -lm -lxml2 -lz -lm -lxml2 -lz -lm -lcrypt -liconv

配置php-fpm

拷贝配置文件,在安装目录里
cd /alidata/server/php56/etc
cp php-fpm.conf.default php-fpm.conf 
修改配置文件
vim php-fpm.conf
将listen = 127.0.0.1:9000 改为listen = 127.0.0.1:9056
与php5.59000端口区别开,防止端口冲突

拷贝服务脚本,在源码包里
# cp sapi/fpm/init.d.php-fpm /etc/init.d/php56-fpm
# chmod +x /etc/init.d/php56-fpm
# chkconfig --add php56-fpm

启动php-fpm

 service php56-fpm start
 监听端口为:9056

nginx 切换php版本只需修改nginx.conf即可
php5.5 php-fpm 监听端口为:9000
php5.6 php-fpm监听端口为:9056

vim /etc/nginx/nginx.conf
将fastcgi_pass   127.0.0.1:9000;修改为
  fastcgi_pass   127.0.0.1:9056;
  重启nginx,打开phpinfo

apache切换PHP版本:
由于之前是用php mod来运行php,php作为apache的一个模块来运行。如果想要使用多版本切换,就不能再用php mod来运行了,必须要用php-fpm运行,然后和Apache关联。

修改配置文件

vim /etc/httpd/httpd.conf

首先注释掉以下内容(这是用php mod与PHP关联的)

#LoadModule php5_module modules/libphp5.so
#<FilesMatch \.php$> 
   #SetHandler application/x-httpd-php
#</FilesMatch>

然后去掉以下两行的注释,开启代理功能

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

再添加下面内容,使用php-fpm与PHP关联

<FilesMatch \.php$>
         SetHandler "proxy:fcgi://127.0.0.1:9056"
</FilesMatch>

重启apache服务,成功切换为php5.6
致此全部完成,nginx和apache全都可以正常切换PHP版本

WampServer死活连不上SQLServer的解决办法

下载了Wamp Server 2.5,连接MSSQLServer 2008 R2,一直提示“Fatal error: Call to undefined function sqlsrv_connect()”。

网上的办法全都试过也还是不管用(包括ext目录中添加dll、php.ini添加dll设置、ntwdblib.dll加入system32等等)。

如果遇到类似以上问题并且山穷水尽的同学,可以往下看。

首先在此感谢解决原作者:https://blog.csdn.net/xocom/article/details/45840725

下面开始说问题原因和方法。

原因:

经测试,微软最新发布的microsoft Drivers 3.1 for PHP for SQL Server仅支持32位的php5.5版本,在win7 64位系统中安装32位wamp环境可以正常开启扩展,但是安装了64位的wamp环境就不能开启扩展,网上查发现很多人反应64位的扩展源码编译不出来。

也就是说,微软发布的DLL扩展在64位的wamp中不能用

解决办法:

下载以下安装包,找到x64目录中对应的DLL,放到你的php/ext目录下。

地址一:http://oa.jnszkj.com/ueditor/php/upload/file/20180622/1529665745721557.zip

地址二:http://www.weka.cc/ueditor/php/upload/file/20180622/1529665745721557.zip

再次感谢原作者!感谢CSDN!感谢百度!微软就不谢了。

ERR: SOAP-ERROR: Parsing WSDL: Couldn’t load from XXX解决方案

原文链接:http://myitlife.blog.51cto.com/2289784/1529621

PHP在用SOAP协议做接口的时候,经常会碰到如下问题,不是不成功,而是偶尔不成功,实在让人费解!

ERR: SOAP-ERROR: Parsing WSDL: Couldn’t load from ‘http://www.xxxxx.com/member/member_sync.php?wsdl’ : failed to load external entity “http://www.xxxxx.com/member/member_sync.php?wsdl”

查找日志发现:

NOTIC: [2] SoapClient::SoapClient(): I/O warning : failed to load external entity “http://www.xxxxx.com/member/member_sync.php?wsdl” /home/wwwroot/default/xxxxx.com/App/Modules/Admin/Action/OrderAction.class.php 第 112 行.客户端$client = new SoapClient ( $url );创建SoapClient对象时出错!

网上查找很多资料,有开启selinux、关闭soap缓存、开启openssl等等答案,但尝试过后都不尽人意,现终极解决办法:

只需把php的客户端SoapClient的wsdl模式修改为non-wsdl模式,即可解决!

wsdl模式:

$url = “http://xxxxx.org/member/member_sync.php?wsdl”;

$client = new SoapClient ( $url );

non-wsdl模式:

$client = new SoapClient(null,array(‘location’=>’http://www.xxxxx.com/member/member_sync.php’,uri => ‘member_sync.php’));

Windows环境下安装phpunit

参考文章:http://blog.csdn.net/sunshinelyc/article/details/49834293#comments

进来由于工作需要,安装phpunit,在网上找了各种安装方法,pear添加phpunit通道安装,手动安装,各种失效,各种无语,皆因网上的资料都是年份比较久远的(也有可能本人不太了解phpunit的工作原理),导致安装了一个下午进展缓慢。最后在phpunit.de中看到了一篇文章,然后第二天再试着安装了一次,具体成功了(然后也对phpunit有了一个比较基础的了解)故此,记录一下本人安装phpunit的过程,方便自己和路人查阅,该文章仅作为本人查阅之用,故此希望网友看到了不要吐槽。。微笑

话不多说,直接开展。。。

首先,官网文档连接如下phpunit.de ,如果是由于年份久远导致无法连接的只能再找找资料了(再网上找资料的时候就碰到了一大推年份久远导致链接失效的情况。。。大哭,导致坑越来越深。。。)

安装步骤如下:

其实安装过程非常非常非常简单。。(注意用了三个非常,足以证明强调意义)

1、在官网下载phpunit.phar包,链接如下:phpunit.phar,下载和自己php版本对应的稳定包即可。(注意:这里是PHPUnit 的 PHP 档案包,它将 PHPUnit 所需要的所有必要组件(以及某些可选组件)捆绑在这个文件中)

2、创建一个文件夹,这里我在d盘创建了phpunit,路径为D:\phpunit,将该路径添加到path环境变量中,然后将下载好的phpunit.phar放到该文件夹中

3、打开一个cmd窗口,按照如下执行(每个人的cmd路径不一样,不要对号入座。。):

C:\Users\Administrator>d:

D:\>cd phpunit

D:\phpunit>echo @php “%~dp0phpunit.phar” %* > phpunit.cmd

D:\phpunit>exit

4、重新打开一个新的cmd窗口,在cmd中执行执行phpunit –version

C:\Users\Administrator>phpunit –version
PHPUnit 4.8.18 by Sebastian Bergmann and contributors.

这样子就表示你的phpunit已经安装完成了。。是不是超级简单。。不到半个小时就搞定的事情,我昨天研究了一个下午。。也是够蠢的。。。(不要局限于用pear安装。安装方法各种各样。结果达到就行。。),暂时介绍安装。后续继续补充phpunit的学习过程,毕竟这东西,才有一点点概念。至于怎么使用。原理是什么还是一头雾水。。

Zend Framework单元测试方法

Update: Things are all change in Zend Framework 1.8, so this may require some adaptation in that version.

If you’ve followed the Zend Framework quickstart tutorial like me, you may be wondering how to perform unit testing using it. The tutorial does set up the bootstrap file to allow for unit testing, but does not cover unit testing itself. The aim of this post is to  provide a quick guide to unit testing using the quickstart application, which will hopefully come in useful for a few people and myself when I inevitably forget this later on.

Step 0: Before Starting

First, you should download and set up the guestbook application from the Zend Framework website. Make sure you place the Zend library in the library folder and enable the read/write permissions for the sqlite database and the db directory for access by the web server.

You will also want to install pear and, with it, install PHPUnit:

pear channel-discover pear.phpunit.de

pear install phpunit/PHPUnit

Step 1: Create Test Folders

Create a folder called “tests” in the root folder of the application. Inside that create a folder called “controllers” and “models”. The  directory structure should be as follows:

zendquickstart
|-- application
|-- data
|-- library
|-- public
|-- scripts
`--tests
 |-- controllers
 `-- models

All your controller tests should go in the controllers folder, all your model tests should go in the models folder.

Step 2: Create Test Configuration

Create the file TestConfiguration.php in the tests folder. This file will initially set up the testing configuration, inside place the following code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
// Gets called when this file is included/required
TestConfiguration::setUp();

class TestConfiguration
{
    /**
    * Sets the environment up for testing
    */
    static function setUp()
    {
        // Set the environment constant to testing which will load the testing
        // configuration in app.ini by the bootstrap
        define('APPLICATION_ENVIRONMENT', 'testing');

        // Set the include path for locating the Zend library
        set_include_path(realpath(dirname(__FILE__)) . '/../library'
            . PATH_SEPARATOR . get_include_path());

        // Use Autoload so that we don't have to include/require every class
        require_once "Zend/Loader.php";
        Zend_Loader::registerAutoload();
    }

    static function setUpDatabase()
    {
        require '../application/bootstrap.php';

        $db = Zend_Registry::get('configuration')->database->params->dbname;

        // delete any pre-existing databases
        if(file_exists($db)) unlink($db);

        // run the database set up script to recreate the database
        require '../scripts/load.sqlite.php';
    }
}
?>

The setUp() function in this class will get called when the file is included or required. The APPLICATION_ENVIRONMENT constant is set to ‘testing’ so that the testing section of the app.ini file is read in the bootstrap, and the testing database is used. A testing database should be used so that testing does not interfere with the production or development databases, and no important  data is lost. The next step is to set the include path, which should contain the location of the Zend Framework library. The final step is to enable the Zend autoloader so that we don’t have to explicitly require/include the Zend libraries.

The setUpDatabase() function resets the database to a known state. When the tests are run we may wish to insert data to the database and this should be removed before every new test. We require the bootstrap file so we can get the database configuration and delete the database file, which is an easy way to reset an SQLite database. A different method will be necessary for other databases like MySQL or PostgreSQL. Finally, the setUpDatabase() function uses a script which comes with the quick start application to (re)create the database.

Step 3: Creating Controller Tests

To test the IndexController, create the file IndexControllerTest.php in the tests/controller directory. The following is a simple example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
// Set up the testing environment
require 'TestConfiguration.php';

class controllers_IndexControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
{
    // Bootstraps the application
    public $bootstrap = '../application/bootstrap.php';

    public function testHomePageIsASuccessfulRequest()
    {
        // Runs the test on /, the homepage
        $this->dispatch('/');

        // Tests there are no exceptions on the home page
        $this->assertFalse($this->response->isException());

        // Tests for redirection to the error handler
        $this->assertNotRedirect();
    }

    public function testHomePageDisplaysCorrectContent()
    {
        // Runs the test on /
        $this->dispatch('/');

        // Tests the page title is present
        $this->assertQueryContentContains(
            'div#header-logo',
            'ZF Quickstart Application'
        );

        // Tests the guestbook link is present
        $this->assertQueryContentContains('a', 'Guestbook');
    }
}
?>

This is a very basic controller test. First note that you should extend Zend_Test_PHPUnit_ControllerTestCase for controller tests. This class extends PHPUnit_Framework_TestCase itself, but adds some assertions and other things specific to Zend Framework.

The bootstrap instance variable must be set in order to test the controller, and in this case it points to the location of the bootstrap file.

The testHomePageIsASuccessfulRequest() test is used to test that the homepage functions correctly; it should not contain any exceptions or redirect to the error controller. If it does then there is a problem somewhere and the test fails. The testHomePageDisplaysCorrectContent() is used to test that the page title and the link to the guestbook is present.

Step 4: Creating Model Tests

To test the GuestBook model, create the file GuestBookTest.php in tests/models.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
require 'TestConfiguration.php';
require '../application/models/GuestBook.php';

class models_GuestBookTest extends PHPUnit_Framework_TestCase
{
    public function setUp()
    {
        // Reset database state
        TestConfiguration::setUpDatabase();
    }

    public function testFetchEntries()
    {
        // Instantiate the GuestBook model
        $guestBook = new Model_GuestBook();

        // Get all entries from the database
        $entries = $guestBook->fetchEntries();

        // Test that there are 2 entries in the guestbook
        $this->assertSame(2, count($entries));
    }
}
?>

Again, this is very basic. The setUp() function gets called by PHPUnit before the test is run, and it will reset the database. The testFetchEntries() function tests the fetchEntries() function in the model. Two rows in the guestbook table should be present, therefore there should be two elements in the array returned by fetchEntries().

Step 5: Edit load.sqlite.php

You may find it annoying to have to wait 5 seconds between model tests when the database is recreated. I worked around this problem by making a small change to the PHP script which loads the database schema:

1
2
3
4
5
6
7
8
9
<?php
if (APPLICATION_ENVIRONMENT != 'testing')
{
    echo 'Writing Database Guestbook in (control-c to cancel): ' . PHP_EOL;
    for ($x = 5; $x > 0; $x--) {
        echo $x . "\r"; sleep(1);
    }
}
?>

If the application environment is not testing then the timeout should not be displayed. You may prefer to simply remove the timeout altogether. Additionally, you will need to change the lines that locate the SQL files to include dirname(FILE):

1
2
3
4
<?php
$schemaSql = file_get_contents(dirname(__FILE__) . '/schema.sqlite.sql');
$dataSql = file_get_contents(dirname(__FILE__) . '/data.sqlite.sql');
?>

Step 6: Running the Tests

To run the tests, navigate to the tests directory in a terminal/CMD, and type phpunit controllers_IndexControllerTest and models_GuestBookTest to test the IndexController and GuestBook model, respectively.

phpunit controllers_IndexControllerTest

PHPUnit 3.3.14 by Sebastian Bergmann.

..

Time: 0 seconds

OK (2 tests, 4 assertions)

phpunit models_GuestBookTest

PHPUnit 3.3.14 by Sebastian Bergmann.

Database Created

Data Loaded.

.

Time: 0 seconds

OK (1 test, 1 assertion)

Conclusion

There you have it. This isn’t necessarily the only way or the best way to perform unit testing, this is merely the way I got it to work with the quickstart application having had no prior experience with PHPUnit. Any suggestions or improvements are welcome.

Credits

I based this on the Zend Framework manual and the book Zend Framework in Action.

让PHP以ROOT权限执行系统命令的方法

原文地址:http://www.jb51.net/article/26232.htm

用来作为解决php以root权限执行一些普通用户不能执行的命令或应用的参考。
其实php里的popen()函数是可以解决这个问题的,但是由于某些版本的linux(如我使用的Centos 5)对系统安全的考虑,
使得这个问题解决起来麻烦了好多。先来看一个网友使用popen()函数的例子。

复制代码代码如下:
/* PHP中如何增加一个系统用户
下面是一段例程,增加一个名字为james的用户,
root密码是 louis。仅供参考
*/
$sucommand = “su root –command”;
$useradd = “/scripts/demo/runscripts.php”;
$rootpasswd = “louis”;
$user = “james”;
$user_add = sprintf(“%s %s”,$sucommand,$useradd);
$fp = @popen($user_add,”w”);
@fputs($fp,$rootpasswd);
@pclose($fp);

经过自己的测试,证实此段代码是不能实现(至少在我的系统里是这样的)作者想要获得的结果的。经过自己很长时间的google之后,
问题的关键是su root这个命令需要的密码必须以终端的方式输入,不能通过其它的方式(我也不知道还有没有其它的方式)获得。
又由于项目要求不能使用类似于sudo这种应用,无奈之下,我选择了网友提出的用编写C程序的方法来解决此问题。
首先写个C程序,命名为:run.c 放在目录/scripts/demo/下

复制代码代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
uid_t uid ,euid;
//char cmd[1024]; //变量暂时未使用
uid = getuid() ;
euid = geteuid();
printf(“my uid :%u\n”,getuid()); //这里显示的是当前的uid 可以注释掉.
printf(“my euid :%u\n”,geteuid()); //这里显示的是当前的euid
if(setreuid(euid, uid)) //交换这两个id
perror(“setreuid”);
printf(“after setreuid uid :%u\n”,getuid());
printf(“afer sertreuid euid :%u\n”,geteuid());
system(“/scripts/demo/runscripts.php”); //执行脚本
return 0;
}

编译该文件:
gcc -o run -Wall run.c
在该路径下生成run文件,这个可执行文件。如果现在用PHP脚本调用 该run的话,即使setreuid了 也是不行的。
接下来要做的是:给run赋予suid权限
# chmod u+s run
# ls
# -rwsr-xr-x 1 root root 5382 Jul 2 21:45 run
好了,已经设置上了,再写一个php页面调用它。

复制代码代码如下:
<?php
echo ‘<pre>’;
$last_line = system(‘/scripts/demo/run’, $retval);
echo ‘
</pre>
<hr />Last line of the output: ‘ . $last_line . ‘
<hr />Return value: ‘ . $retval;
?>

在浏览器中浏览。
my uid :48
my euid :0
after setreuid uid :0
afer sertreuid euid :48

——————————————————————————–
Last line of the output: afer sertreuid euid :48
——————————————————————————–
Return value: 0
该命令执行成功。
从显示结果可以看出: apache(daemon)的uid 为48(事实上很多linux系统下daemon的uid为2)。
调用setreuid后将有效用户id和实际用户id互换了。(必须在chmod u+s生效的情况下) 使apache当前的uid为0这样就能执行root命令了。
只需要更改 C文件中的system所要执行的命令就可以实现自己的PHP以root角色执行命令了。

在玩C 以前 玩过一段时间的PHP, 哪个时候需要用PHP 来运行root命令,一直未果,直到有一天搜索到了super这个插件.
随着玩C的日子多了.发现可以用C语言来包裹 要运行的外部命令. 实验了一下.成功了.
不需要任何外部工具就可以实现用PHP 执行root命令.
我下面就把方法发布给大家,有需求用php来运行root命令的朋友可以不用发愁了.
平台:Linux. 实验命令iptables 当前的目录是/var/www/html/http
写程序的时候 用root用户
大家都知道iptables 非root用户不能运行.
首先写个C程序
命名为:ipt.c

复制代码代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
uid_t uid ,euid;
uid = getuid() ;
euid = geteuid();
printf(“my uid :%u\n”,getuid()); //这里显示的是当前的uid 可以注释掉.
printf(“my euid :%u\n”,geteuid()); //这里显示的是当前的euid
if(setreuid(euid, uid)) //交换这两个id
perror(“setreuid”);
printf(“after setreuid uid :%u\n”,getuid());
printf(“afer sertreuid euid :%u\n”,geteuid());
system(“/sbin/iptables -L”); //执行iptables -L命令
return 0;
}

编译该文件 gcc -o ipt -Wall ipt.c
在该路径下生成ipt 这个可执行文件.
如果现在用PHP网页调用 该ipt的话,即使setreuid了 也是不行的.
接下来要做的是chmod u+s ./ipt
ls 一下
-rwsr-xr-x 1 root root 5382 Jul 2 21:45 ipt
s位已经设置上了.
再写一个php页面调用它.

复制代码代码如下:
<?php
echo ‘<pre>’;
$last_line = system(‘/var/www/html/http/ipt’, $retval);
echo ‘
</pre>
<hr />Last line of the output: ‘ . $last_line . ‘
<hr />Return value: ‘ . $retval;
?>

在浏览器中浏览.

[color=Red]Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy DROP)
target prot opt source destination
ACCEPT all — anywhere anywhere state RELATED,ESTABLISHED
Chain OUTPUT (policy ACCEPT)
target prot opt source destination [/color]
[color=Blue]my uid :48
my euid :0
after setreuid uid :0
afer sertreuid euid :48[/color]

——————————————————————————–
Last line of the output: afer sertreuid euid :48
——————————————————————————–
Return value: 0

该命令执行成功..
众所周知: apache的uid 为48. 调用setreuid后 将有效用户id 和实际用户id互换了.(必须在chmod u+s生效的情况下) 使apache当前的 uid为0 这样就能执行root命令了。

大家只需要更改 C文件中的 system所要执行的命令就可以实现自己的PHP执行root命令了.

Linux下PHP开启Oracle支持(oci8)(补充pdo_oci)

原文地址:http://www.2cto.com/database/201412/364299.html

http://www.cnblogs.com/huangzhen/archive/2011/09/14/2176607.html

使用php的常见问题是:编译php时忘记添加某扩展,后来想添加扩展,但是因为安装php后又装了一些东西如PEAR等,不想删除目录重装,那么此时就需要自己重新增加某模块支持了,Linux操作系统下可以用phpize给PHP动态添加扩展.下面就以扩展模块 oci8为例(php连接oracle数据库需要改扩展支持)做简单的说明.(以下所有资源可以访问http://download.csdn.net/detail/haiqiao_2010/8294513 进行统一下载

1.下载Oracle客户端程序包,其中包含OCI、OCCI和JDBC-OCI等相关文件

1.1 根据Linux系统选择对应的软件,我的为32位系统,所以下载如下文件:

oracle-instantclient11.2-basic-11.2.0.3.0-1.i386.rpm

oracle-instantclient11.2-devel-11.2.0.3.0-1.i386.rpm

1.2下载地址: http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html (Oracle官网下载需要注册用户)

2.安装oracle客户端,运行以下命令即可:

 

rpm -ivh oracle-instantclient11.2-basic-11.2.0.3.0.i386.rpm

rpm -ivh oracle-instantclient11.2-devel-11.2.0.3.0.i386.rpm

3.安装oci8 php扩展

3.1 下载oci8-1.4.10.tgz

下载地址:http://pecl.php.net/get/oci8-1.4.10.tgz

3.2 把下载文件上传至linux服务器,并进行解压

命令:tar zxvf oci8-1.4.10.tgz#解压

3.3 转到解压目录

命令:cd oci8-1.4.10

3.4 使用phpize准备 PHP 外挂模块的编译环境,会根据指定的环境变量生成编译时需要的makefile,phpize是属于php-devel的内容,所以centos下只要运行yum install php-devel进行安装即可 (注意:/usr/local/php/bin/phpize 为我的php目录,不同则需改之;如果是64位的系统,client改成client64)

/usr/local/php/bin/phpize CFLAGS=”-I/usr/lib/oracle/11.1/client” CXXFLAGS=”-I/usr/lib/oracle/11.1/client”

3.5 编译,安装

 

要有与现有php完全相同的php压缩包。我用的是php-5.5.3.tar.gz。展开后进入里面的ext/oci8目录下,

然后执行命令: /usr/local/php/bin/phpize #这是一个可执行的文本文件,要确保它在系统中

会发现当前目录下多了一些configure文件,

如果没报错,则运行命令;

./configure –with-php-config=/usr/local/php/bin/php-config –with-oci8=/usr/lib/oracle/11.1/client

 

注意要先确保/usr/local/php/bin/php-config存在。如果你的php安装路径不是默认的,要改。

再运行以下命令 ,然后它告诉你一个目录,你把该目录下的oci8.so拷贝到你php.ini中的extension_dir指向的目录中

make
make install需要强调的是make的时候会报错,显示各种找不到库文件,需要对makefile文件进行修改加入oralce的运行库地址

打开makefile,寻找INCLUDE,形式如下:

INCLUDES = -I/usr/local/php/include/php -I/usr/include/oracle/10.2.0.3/client

然后在末尾加上=”-I/usr/lib/oracle/11.1/client,然后重新make就会成功了。

4. 修改PHP.ini(/usr/local/php/etc/php.ini)

在extension_dir = “/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/”后增加一行:

extension = “oci8.so”

注意:要确保/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/ 该目录下有oci8.so文件

5.重启apache,让oci生效

6.在web目录下创建phpinfo.php文件在其中输入一下内容,并通过web访问

 

<?php
	phpinfo();
?>

如果找到OCI8的部分就说明OCI安装正常了,如下图所示\
\

说明oci8安装成功,接下来就可以使用php访问oracle数据库

 

补充:pdo_oci的安装

1)进入文件夹

# cd php-5.3.10/ext/pdo_oci/

2) 用phpize来扩展,文件夹内执行: phpize

[root@jinniu-test3 pdo_oci]# /alidata/server/php/bin/phpize
Configuring for:
PHP Api Version:         20090626
Zend Module Api No:      20090626
Zend Extension Api No:   220090626

3) 编译安装

# ./configure --with-php-config=/alidata/server/php/bin/php-config --with-pdo-oci=/usr/lib/oracle/12.1/client64
# make && make install

这里同样注意,如果发生错误,则修改Makefile,在其中的INCLUDES继续添加以下内容(根据自己的路径修改):

-I/usr/include/oracle/12.1/client64 -I/usr/lib/oracle/12.1/client64

执行顺利完成后,最后一行可以看到,已经将pdo_oci.so文件放入php的modules下,只需修改下php.ini文件,添加extension=pdo_oci.so即可

PHPWord利用模板替换字符串生成精确的word文档

phpword处理docx模板时候始终发生神奇的BUG,就是复制原版例子里的${Value1}进自己的模板然后替换是没问题的,但是只要一改动这个变量文字,PHP做相应替换就失效了。

用了下残废百度无果,一怒翻起google,准确度高多了。

原来有2个PHPWord项目:

其中适用比较广的是PHPOffice项目下的一个子项目

Git地址:https://github.com/PHPOffice/PHPWord

查看官方的文档:

http://phpword.readthedocs.org/en/latest/templates-processing.html?highlight=replace

具体如何用模板做替换:

  1. include_once (‘exec/lib/phpword/src/PhpWord/PHPWord.php’);
  2. use PhpOffice\PhpWord\Autoloader;
  3. use PhpOffice\PhpWord\Settings;
  4. use PhpOffice\PhpWord\IOFactory;
  5. include_once (‘exec/lib/phpword/src/PhpWord/Autoloader.php’);
  6. Autoloader::register();
  7. Settings::loadConfig();
  8. // Create a new PHPWord Object
  9. $PHPWord = new \PhpOffice\PhpWord\PhpWord();
  10. $templateProcessor = new \PhpOffice\PhpWord\TemplateProcessor(‘statics/template/adminPositive.docx’);
  11. $templateProcessor->setValue(‘xm1’‘姓名’);
  12. $templateProcessor->setValue(‘zw1’‘公务员’);
  13. $templateProcessor->setValue(‘sfz1’‘360281199909090009’);
  14. $templateProcessor->setValue(‘gz1’‘统发’);
  15. //$templateProcessor->setValue(‘Street’, ‘Coming-Undone-Street 32’);
  16. $templateProcessor->saveAs(‘test.docx’);

这里要注意的是换行问题。

另外copy一篇比较nice的博文做个备份

转载自:http://wangye.org/blog/archives/943/

===============================================================================================

最近一个项目开发要用到PHP技术导出Word文档,比较了几种方案,首先是使用Microsoft Office自带的ActiveX/COM组件,比如Word.Application,这种方式的优点是格式兼容度高,可以生成纯doc的Word2003格式文档,缺点一是比较占资源(调用会启动一个WINWORD.EXE进程),不适合Web多用户访问使用;二是PHP这种Web开发技术大多数是跑在Linux服务器上,当然也就无法使用Windows下的技术了,平台可移植和兼容性不好。第二种生成Word的方案是生成Word兼容的网页格式,然后以Word方式打开,这种方案总体上感觉怪怪的,毕竟文件格式是HTML的,而且格式兼容度不好,不过这种方式的优点是节省服务器资源,能够快速生成;最后一种方案也就是今天的主角,采用PHPWord生成Word2007(docx)格式的文档,现在基本上微软Office Word 2003以后的版本均兼容这种格式了,对于2003版本来说,仅需要下载安装个兼容格式包(下载地址),也能正常打开这类文件,当然如果你使用的是最新版本的Office(包括但不限于Office 2007、Office 2010)则不需要安装此格式包。

好了,下面我就介绍一下PHPWord,大家可以通过访问项目主页下载并获得关于项目的更多信息。

我在使用过程中主要遇到了中文乱码的问题,结合网上大神们的指导,通过下面的方式解决了这类问题,希望对大家有所帮助。

1、增加东亚字体支持

打开并编辑路径/Writer/Word2007/Base.php文件内容,大概在第349行(行数随着版本可能会有变化)大概函数_writeTextStyle内添加:

  1. $objWriter->writeAttribute(‘w:eastAsia’$font)

比如我的修改片段基本是下面这样:

  1. // Font
  2. if($font != ‘Arial’) {
  3.     $objWriter->startElement(‘w:rFonts’);
  4.         $objWriter->writeAttribute(‘w:eastAsia’$font); // 添加这行
  5.         $objWriter->writeAttribute(‘w:ascii’$font);
  6.         $objWriter->writeAttribute(‘w:hAnsi’$font);
  7.         $objWriter->writeAttribute(‘w:cs’$font);
  8.     $objWriter->endElement();
  9. }

2. 解决中文乱码问题

编辑PHPWord/Template.php,找到代码$replace = utf8_encode($replace);,删除或者注释掉这行代码,添加$replace = iconv( 'gbk','utf-8', $replace);,比如代码改为如下:

  1. /**
  2.  * Set a Template value
  3.  * 
  4.  * @param mixed $search
  5.  * @param mixed $replace
  6.  */
  7. public function setValue($search$replace) {
  8.     if(substr($search, 0, 2) !== ‘${‘ && substr($search, -1) !== ‘}’) {
  9.         $search = ‘${‘.$search.‘}’;
  10.     }
  11.     if(!is_array($replace)) {
  12.         //$replace = utf8_encode($replace);
  13.         $replace =iconv(‘gbk’‘utf-8’$replace); // 注释掉上面行后添加这行
  14.     }
  15.     $this->_documentXML = str_replace($search$replace$this->_documentXML);
  16. }

调用方式如下:

  1. $document->setValue(‘Template’, iconv(‘utf-8’‘GB2312//IGNORE’‘中文’));

上面的代码主要解决模板的问题,下面同样的道理,解决Section添加文本的问题,找到代码$givenText = utf8_encode($text);,删除或者注释掉这行代码,添加$givenText = iconv('gbk', 'utf-8', $text);,比如代码如下:

  1. /**
  2.  * Add a Text Element
  3.  * 
  4.  * @param string $text
  5.  * @param mixed $styleFont
  6.  * @param mixed $styleParagraph
  7.  * @return PHPWord_Section_Text
  8.  */
  9. public function addText($text$styleFont = null, $styleParagraph = null) {
  10.     //$givenText = utf8_encode($text);
  11.     $givenText = iconv(‘gbk’‘utf-8’$text); // 注释掉上面行后添加这行
  12.     $text = new PHPWord_Section_Text($givenText$styleFont$styleParagraph);
  13.     $this->_elementCollection[] = $text;
  14.     return $text;
  15. }

调用方式和上面的模板调用大同小异,这边就不列举了。

折腾了这么多,突然发现网上还有另外一个版本的PhpWord,项目类名大小写上略有不同,隶属于PHPOffice/PHPWordGitHub项目地址文档)。这个版本的PHPWord内容更加丰富,支持的功能也比较多(包括行间距,缩进和首行缩进等),最后我也采取的这个版本的PHPWord,值得注意的是这两个版本的PHPWord在API接口上基本一致,可以通用。但是有些API,在PHPOffice/PHPWord里是不推荐的,比如createSection需要改成addSection,另外应用这个版本的PHPWord不需要像上面那样做任何中文支持的修改,比较省事。

这两个PHPWord项目的官方都提供了较详细的使用例子和文档,这里就不介绍了。最后提示的是:在模板模式下loadTemplate,只能使用setValue等模板操作方法,不能再添加段落或者段落修改了。这个略有不便。

参考文档:phpword 部分BUG修改笔记及心得

对于PHPOffice/PHPWord我提供一个简单的例子供参考(当然官方例子更多):

  1. require_once ‘PhpOffice/PhpWord/PhpWord.php’// 包含头文件
  2. use PhpOffice\PhpWord\Autoloader;
  3. use PhpOffice\PhpWord\Settings;
  4. use PhpOffice\PhpWord\IOFactory;
  5. require_once __DIR__ . ‘/PhpOffice/PhpWord/Autoloader.php’;
  6. Autoloader::register();
  7. Settings::loadConfig();
  8. // Create a new PHPWord Object
  9. $PHPWord = new \PhpOffice\PhpWord\PhpWord();
  10. $PHPWordHelpernew \PhpOffice\PhpWord\Shared\Font();
  11. $PHPWord->setDefaultFontName(‘仿宋’); // 全局字体
  12. $PHPWord->setDefaultFontSize(16);     // 全局字号为3号
  13. // 设置文档的属性,这些在对文档右击属性可以看到,也可以省去这些步骤
  14. $properties = $PHPWord->getDocumentProperties();
  15. $properties->setCreator(‘张三’);   // 创建者
  16. $properties->setCompany(‘某公司’); // 公司
  17. $properties->setTitle(‘某某文档’); // 标题
  18. $properties->setDescription(‘http://wangye.org’); // 描述
  19. $properties->setLastModifiedBy(‘李四’); // 最后修改
  20. $properties->setCreated( time() );      // 创建时间
  21. $properties->setModified( time() );     // 修改时间
  22. // 添加3号仿宋字体到’FangSong16pt’留着下面使用
  23. $PHPWord->addFontStyle(‘FangSong16pt’array(‘name’=>‘仿宋’‘size’=>16));
  24. // 添加段落样式到’Normal’以备下面使用
  25. $PHPWord->addParagraphStyle(
  26.   ‘Normal’,array(
  27.     ‘align’=>‘both’,
  28.     ‘spaceBefore’ => 0,
  29.     ‘spaceAfter’ => 0,
  30.     ‘spacing’=>$PHPWordHelper->pointSizeToTwips(2.8),
  31.     ‘lineHeight’ => 1.19,  // 行间距
  32.     ‘indentation’ => array// 首行缩进
  33.       ‘firstLine’ => $PHPWordHelper->pointSizeToTwips(32)
  34.     )
  35.   )
  36. );
  37. // Section样式:上3.5厘米、下3.8厘米、左3厘米、右3厘米,页脚3厘米
  38. // 注意这里厘米(centimeter)要转换为twips单位
  39. $sectionStyle = array(
  40.     ‘orientation’ => null,
  41.     ‘marginLeft’ => $PHPWordHelper->centimeterSizeToTwips(3),
  42.     ‘marginRight’ => $PHPWordHelper->centimeterSizeToTwips(3),
  43.     ‘marginTop’ => $PHPWordHelper->centimeterSizeToTwips(3.5),
  44.     ‘marginBottom’ => $PHPWordHelper->centimeterSizeToTwips(3.8),
  45.     ‘pageNumberingStart’ => 1, // 页码从1开始
  46.     ‘footerHeight’ => $PHPWordHelper->centimeterSizeToTwips(3),
  47. );
  48. $section = $PHPWord->addSection($sectionStyle); // 添加一节
  49. // 下面这句是输入文档内容,注意这里用到了刚才我们添加的
  50. // 字体样式FangSong16pt和段落样式Normal
  51. $section->addText(‘文档内容’‘FangSong16pt’‘Normal’);
  52. $section->addTextBreak(1); // 新起一个空白段落
  53. $objWriter = IOFactory::createWriter($PHPWord‘Word2007’);
  54. $objWriter->save(‘/path/to/file’); // 保存到/path/to/file路径下

CentOS下添加PHP扩展模块mssql

原文地址:http://www.showerlee.com/archives/1269

问题描述:利用yum安装了php-mssql,但仍然phpinfo中没有mssql的信息,最后用了本文编译安装的方法,成功了。

原文内容:

如果在LINUX系统上需要使用PHP连接Microsoft SQL Server 2005数据库,我们常见的连接数据库方式是使用ODBC方式连接.

FreeTDS为Linux系统提供了TDS协议的开源客户端。由于MSSQL和Sybase使用的恰是TDS协议,所以在Linux中可以用FreeTDS连接MSSQL,下面简绍使用php的db-lib连接Microsoft SQL Server 2005数据库.

 

LINUX操作系统:   centOS6.3 64bit(安装了系统默认开发包)

APACHE:            httpd-2.4.4

PHP:                  php-5.4.13

freetds:             freetds-0.91

 

一.关闭iptables和SELINUX

# service iptables stop

# setenforce 0

# vi /etc/sysconfig/selinux

—————

SELINUX=disabled

—————

 

二.同步时间

# ntpdate cn.pool.ntp.org

 

一.安装APACHE+PHP

传送门:http://www.showerlee.com/archives/6

 

二.使用FreeTDS启用PHP连接MSSQL

1.下载FreeTds

# su –

# wget ftp://ftp.freetds.org/pub/freetds/stable/freetds-0.91.tar.gz

 

2.安装FreeTds

# tar -zxvf freetds-0.91.tar.gz

# cd freetds-0.91

# ./configure –prefix=/usr/local/freetds –with-tdsver=8.0 –enable-msdblib –enable-dbmfix –with-gnu-ld –enable-shared –enable-static

# make && make install

 

3.启用PHP连接MSSQL

方法一:编译php加上freetds路径(初次部署推荐)

# wget http://museum.php.net/php5/php-5.4.13.tar.gz

# tar -jxvf php-5.4.13.tar.bz2

# cd php-5.4.13

# ./configure –prefix=/usr/local/php5 –with-apxs2=/usr/local/apache2/bin/apxs –with-libxml-dir=/usr/local/lib –with-zlib-dir=/usr/local/lib –with-mysql=/usr/local/mysql –with-mysqli=/usr/local/mysql/bin/mysql_config –with-gd –enable-soap –enable-sockets  –enable-xml –enable-mbstring –with-png-dir=/usr/local –with-jpeg-dir=/usr/local –with-curl=/usr/lib –with-freetype-dir=/usr/include/freetype2/freetype/ –enable-bcmath –enable-calendar –enable-zip –enable-maintainer-zts –with-mssql=/usr/local/freetds

# make && make install

 

方法二:编译PHP的mssql扩展并加上freetds路径(二次部署推荐)

# wget http://cn2.php.net/distributions/php-5.4.13.tar.bz2

# tar -jxvf php-5.4.13.tar.bz2

# cd php-5.4.13/ext/mssql

# /usr/local/php/bin/phpize

# ./configure –with-php-config=/usr/local/php/bin/php-config –with-mssql=/usr/local/freetds

# make && make install

 

安装完毕,按照编译安装后的提示

mssql.so模块会默认保存在 /usr/local/php5/lib/php/extensions/no-debug-zts-20090626/ 目录下

 

加载该模块到php

# vi /usr/local/php5/lib/php.ini

添加如下行:

extension = “/usr/local/php5/lib/php/extensions/no-debug-zts-20090626/mssql.so”

重启apache:

# /usr/local/apache2/bin/apachectl restart

注: 如果编译php加载freetds 时候出现不能找到freetds目录,则需要以下操作(官方的Faq)

# touch /usr/local/freetds/include/tds.h

# touch /usr/local/freetds/lib/libtds.a

 

4.添加phpinfo功能,测试页面

添加以下内容info.php到/usr/local/apache2/htdocs/下,测试php模块是否加载.

# vi  /usr/local/apache2/htdocs/info.php

—————

<?php

echo phpinfo();

?>

—————

检查80端口是否打开

# lsof -i:80

浏览器输入 http://localhost/info.php

显示有如下测试页面内容, mssql.so模块即在PHP下加载成功
mssql

 

5.数据库连接测试页面:

假定mssql数据库IP为192.168.100.10,端口为1433,管理员账号密码都为”sa”

# vi /usr/local/apache2/htdocs/test_mssql_conn.php

———————————————

<?php

if(mssql_connect(‘192.168.100.10,1433′,’sa’,’sa’)){

echo   “成功 “;

}

else   {

echo   “失败 “;

}

?>

———————————————

 

浏览器输入 http://localhost/test_mssql_conn.php

测试最终连接状态.

 

大功告成….

后记: 如果有些朋友使用Yum安装的LAMP环境,然后后期需要添加mssql模块到PHP.

部署方法:

# yum install php-mssql -y

# service httpd restart