存档

文章标签 ‘php’

构建嵌入式Linux + web+sqlite +php5.0 平台

2014年1月16日
构建嵌入式Linux + web+sqlite +php5.0 平台已关闭评论

Web和数据库技术在嵌入式技术中得到越来越广泛的应用,本专题我们来研究如何构建一个嵌入式Linux +web +php+sqlite 平台。

一、 工作软件平台配置

桌面Linux版本: Ubuntu10.04 – LTS

交叉编译器版本: arm-linux-gcc 4.4.3

设置好系统移植编译相关的环境变量,后面编译时用的到,设置方法如下:

#gedit /root/.bashrc  , 在.bashrc 增加如下内容:

export CC=arm-linux-gcc

export AR=arm-linux-ar

export LD=arm-linux-ld

export RANLIB=arm-linux-ranlib

export STRIP=arm-linux-strip

export CC_FOR_BUILD=gcc

保存关闭,gedit ,重新打开命令行终端。

二、移植PHP5

1. 移植zlib库和libxml2库

由于php5需要zlib库和libxml2库的支持,我们首先交叉编译编译zlib库和libxml2库。

1.1    移植zlib库

  • 解压软件包 zlib-1.2.3.tar.bz2 到 zlib-1.2.3目录;

  • 进入到zlib-1.2.3目录,执行 ./configure –shared –prefix=/home/zlibarm 配置 zlib 库;

  • 执行make命令编译 zlib库

  • 执行make install 安装编译好的库

make install 执行完成后, 在/home/zlibarm目录下可以看到我们编译好的 zlib库和相关头文件;

1.2    移植libxml2库

  • 解压软件包libxml2-2.7.8.tar.gz 到libxml2-2.7.8目录

  • 进入到libxml2-2.7.8目录,执行 ./configure –-prefix=/home/libxmlarm –host=arm-linux 配置libxml2库;

  • 执行make命令编译 libxml2库

  • 执行make install 安装编译好的库

make install 执行完成后, 在/home/libxmlarm目录下可以看到我们编译好的 libxml库和相关头文件;

2. 移植PHP5.0软件包

要让我们的WEB服务器支持PHP语言,我们需要移植PHP软件包,PHP软件包我们选择php-5.2.17.tar.gz, PHP移植步骤如下:

  • 解压软件包php-5.2.17.tar.gz到目录php-5.2.17

  • 编写PHP配置脚本文件 elphpcfg.sh, 配置脚本文件内容如下:

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

#! /bin/sh

./configure –prefix=/mnt/disk/eappweb/phparm

–host=arm-linux

–with-sqlite=shared

–with-pdo-sqlite=shared

–with-libxml-dir=/home/libxmlarm

–with-zlib-dir=/home/zlibarm

–disable-all

–enable-pdo=shared

–enable-embed=shared

–with-config-file-path=/mnt/disk/eappweb –with-config-file-scan-dir=/mnt/disk/eappweb

————————————————————————–

  • 编辑完PHP配置脚本文件elphpcfg.sh ,把elphpcfg.sh复制到php-5.2.17目录;

  • 进入php-5.2.17目录,执行 ./elphpcfg.sh配置PHP软件包;

  • 执行make命令编译 PHP5软件包

  • 执行make install 安装编译好的PHP5软件包

make install 执行完成后,在/mnt/disk/eappweb/phparm 目录下可以看到我们交叉编译好的PHP5 库文件及相关可执行文件;

注意: 编译过程中如果出现某些库文件找不到的错误信息,则把刚才编译好的一些库文件复制到编译器库文件所在路径。

三、 移植嵌入式数据库sqlite

Sqlite是嵌入式linux系统中常用的数据库,我们选择的sqlite软件包版本为sqlite-autoconf-3070701[1].tar.gz,Sqlite移植步骤如下:

  • 解压软件包sqlite-autoconf-3070701[1].tar.gz到目录sqlite-autoconf-3070701

  • 进入到sqlite-autoconf-3070701目录,执行./configure –host=arm-linux –prefix=/home/sqlitearm  –disable-tcl 配置sqlite数据库;

  • 执行make命令编译 sqlite软件包

  • 执行make install 安装编译好的sqlite软件包

make install 执行完成后,在/home/sqlitearm 目录下可以看到我们交叉编译好的sqlite 库文件及相关可执行文件;

四 、 移植web服务器appweb

Appweb是在嵌入式linux系统中常用的开源web服务器软件,我们选用的appweb 服务器软件版本为appweb-src-2.4.2-2.zip, appweb 移植步骤如下:

  • 解压软件包appweb-src-2.4.2-2.zip到目录appweb-src-2.4.2;

  • 创建appweb 配置脚本文件 appwebcfg.sh, 配置脚本文件内容如下:

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

#! /bin/sh

./configure –prefix=/home/appwebarm –host=arm-linux –build=i686-pc-linux –disable-shared –disable-shared-libc –enable-static –port=80 –disable-multi-thread –type=RELEASE –disable-test –disable-samples –with-php5=builtin –with-php5-libs=php5 –with-php5-dir=/home/zgdz/php-5.2.17 –with-php5-libpath=/home/zgdz/php-5.2.17/libs –with-php5-iflags="-I/home/zgdz/php-5.2.17  -I/home/zgdz/php-5.2.17/main -I/home/zgdz/php-5.2.17/Zend  -I/home/zgdz/php-5.2.17/TSRM"

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

  • 保存appweb配置脚本文件appwebcfg.sh,并复制到appweb-src-2.4.2目录下;

  • 进入appweb-src-2.4.2目录,执./appwebcfg.sh 配置appweb服务器;

  • 执行make 编译appweb软件包;

  • 执行make install 安装编译好的 appweb软件包;

Make install执行完成后,在/home/appwebarm 目录下可以看到我们交叉编译好的appweb应用软件及相关配置文档。

这样构建嵌入式web服务器 + PHP5 + Sqlite所需用的库文件和软件包都交叉编译完成了,接下来我们开始在嵌入式ARM11开发板 飞凌OK6410上部署嵌入式web服务器 + PHP5 + Sqlite平台。

五、部署嵌入式web PHP5.0 数据库平台

目标平台为飞凌OK6410开发板,在飞凌OK6410开发板上部署嵌入式Linux + appweb + PHP5.0 + sqlite数据库平台步骤如下:

  • 建立 /mnt/disk/eappweb 目录

  • 将appweb、PHP、sqlite相关库文件和配置文件复制到/mnt/disk/eappweb目录下,如下图所示:

构建嵌入式Linux + web+sqlite +php5.0 平台 - lihom_1987@126 - 王老板的博客

其中appweb.conf 是appweb的配置文件,根据实际情况进行配置,这里我们用默认配置即可。Php.ini为 PHP配置文件,修改php.ini文件,设置如下配置参数:

————————————————————————–

short_open_tag = On,

extension_dir = "/mnt/disk/eappweb/"

extension=pdo.so

extension=pdo_sqlite.so

extension=sqlite.so

enable_dl = On

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

  •    设置环境变量LD_LIBRARY_PATH= /mnt/disk/eappweb

  •    运行appweb服务器,执行appweb服务器命令如下:
    ./appweb –f appweb.conf –r /mnt/disk/eappweb

    这样开发板上就运行了appweb服务器。将电脑和开发板用网线连接起来,打开电脑浏览器输入:http://192.168.2.232/test.php 就可以看到PHP测试网页,说明PHP功能测试成功。

六、验证数据 sqlite支持功能

1. 测试数据库加载功能:

编写PHP脚本文件,phptest2.php,内容如下所示:

——————————————————————————-

<?php

if (extension_loaded(‘sqlite’)) {

echo ‘ok’;

}else{

if(!dl(‘sqlite’))

{

echo ‘sorry’;

}

else

{

    echo ‘ok’;

}

}

?>

—————————————————————————–

在浏览器地址栏输入:http://192.168.2.232/phptest2.php,显示OK,说明sqlite库加载成功。

2. 测试sqlite数据库操作功能:

编写脚本文件phptest.php, 内容如下:

————————————————————————–

<?php

$dbname="1.db";

if (!file_exists($dbname))

{

$fp = fopen($dbname, "w+") or die("创建数据库失败!");

fclose($fp);

$db = sqlite_open($dbname) or die("打开数据库失败");

sqlite_query($db, "CREATE TABLE liuyan (id integer primary key,name varchar(10),content text )") or die("建表失败!");;

}

$db = sqlite_open($dbname) or die("打开数据库失败");

if($_POST[‘postdata’])

{

$name=$_POST[‘name’];

$content=$_POST[‘content’];

sqlite_query($db, "INSERT INTO liuyan VALUES (NULL,’".$name."’,’".$content."’)") or die("插入数据失败");

}

$result = sqlite_query($db, ‘select name,content from liuyan’);

while($data=sqlite_fetch_array($result))

$list[]=$data;

?>

<div>

<?php

if(is_array($list))

foreach($list as $key=>$listdata)

echo $listdata[‘name’]. "说:".$listdata[‘content’]."<br />";

?>

</div>

<form action="" method="post">

姓名:<input name="name" type="text" id="name" size="27" /><br />

俺说: <textarea name="content" cols="25" rows="4" id="content"></textarea><br />

<input name="postdata" type="submit" id="postdata" value="提交" />

</form>

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

在浏览器地址栏输入:http://192.168.2.232/phptest.php,显示一个简单的留言板功能。留言后,在开发板的/mnt/disk/eappweb/web目录下可以看到生成的1.db数据库文件。

到这里,我们的嵌入式Linux + web+sqlite +php5.0 平台就构建并且验证完成了。

希望这篇文章对大家移植嵌入式WEB服务器有所帮助。

IT技术, php , , ,

preg_match的使用方法

2009年8月25日
preg_match的使用方法已关闭评论

preg_match

(PHP 4, PHP 5)

preg_matchPerform a regular expression match

Description

int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags [, int $offset ]]] )

Searches subject for a match to the regular expression given in pattern .

Parameters

pattern

The pattern to search for, as a string.

subject

The input string.

matches

If matches is provided, then it is filled with the results of search. $matches[0] will contain the text that matched the full pattern, $matches[1] will have the text that matched the first captured parenthesized subpattern, and so on.

flags

flags can be the following flag:

PREG_OFFSET_CAPTURE
If this flag is passed, for every occurring match the appendant string offset will also be returned. Note that this changes the return value in an array where every element is an array consisting of the matched string at index 0 and its string offset into subject at index 1.

offset

Normally, the search starts from the beginning of the subject string. The optional parameter offset can be used to specify the alternate place from which to start the search (in bytes).

Note: Using offset is not equivalent to passing substr($subject, $offset) to preg_match() in place of the subject string, because pattern can contain assertions such as ^, $ or (?<=x). Compare:

<?php
$subject
= "abcdef";
$pattern = '/^def/';
preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE, 3);
print_r($matches);
?>

The above example will output:

Array
(
)

while this example

<?php
$subject
= "abcdef";
$pattern = '/^def/';
preg_match($pattern, substr($subject,3), $matches, PREG_OFFSET_CAPTURE);
print_r($matches);
?>

will produce

Array
(
    [0] => Array
        (
            [0] => def
            [1] => 0
        )

)

 

Return Values

preg_match() returns the number of times pattern matches. That will be either 0 times (no match) or 1 time because preg_match() will stop searching after the first match. preg_match_all() on the contrary will continue until it reaches the end of subject . preg_match() returns FALSE if an error occurred.

Changelog

Version Description
4.3.3 The offset parameter was added
4.3.0 The PREG_OFFSET_CAPTURE flag was added
4.3.0 The flags parameter was added

Examples

Example #1 Find the string of text "php"

<?php
// The "i" after the pattern delimiter indicates a case-insensitive search
if (preg_match("/php/i", "PHP is the web scripting language of choice.")) {
echo
"A match was found.";
} else {
echo
"A match was not found.";
}
?>

Example #2 Find the word "web"

<?php
/* The \b in the pattern indicates a word boundary, so only the distinct
* word "web" is matched, and not a word partial like "webbing" or "cobweb" */
if (preg_match("/\bweb\b/i", "PHP is the web scripting language of choice.")) {
echo
"A match was found.";
} else {
echo
"A match was not found.";
}

if (preg_match("/\bweb\b/i", "PHP is the website scripting language of choice.")) {
echo
"A match was found.";
} else {
echo
"A match was not found.";
}
?>

Example #3 Getting the domain name out of a URL

<?php
// get host name from URL
preg_match('@^(?:http://)?([^/]+)@i',
"http://www.php.net/index.html", $matches);
$host = $matches[1];

// get last two segments of host name
preg_match('/[^.]+\.[^.]+$/', $host, $matches);
echo
"domain name is: {$matches[0]}\n";
?>

The above example will output:

domain name is: php.net

Example #4 Using named subpattern

<?php

$str = 'foobar: 2008';

preg_match('/(?<name>\w+): (?<digit>\d+)/', $str, $matches);

print_r($matches);

?>

The above example will output:

Array
(
    [0] => foobar: 2008
    [name] => foobar
    [1] => foobar
    [digit] => 2008
    [2] => 2008
)

Notes

Tip

Do not use preg_match() if you only want to check if one string is contained in another string. Use strpos() or strstr() instead as they will be faster.

See Also

 

IT技术, php ,

PHP中的mb_convert_encoding与iconv函数介绍

2009年8月15日
PHP中的mb_convert_encoding与iconv函数介绍已关闭评论

mb_convert_encoding这个函数是用来转换编码的。原来一直对程序编码这一概念不理解,不过现在好像有点开窍了。

不过英文一般不会存在编码问题,只有中文数据才会有这个问题。比如你用Zend Studio或Editplus写程序时,用的是gbk编码,如果数据需要入数据库,而数据库的编码为utf8时,这时就要把数据进行编码转换,不然进到数据库就会变成乱码。

mb_convert_encoding的用法见官方:

http://cn.php.net/manual/zh/function.mb-convert-encoding.php

做一个GBK To UTF-8

< ?php

header("content-Type: text/html; charset=Utf-8");

echo mb_convert_encoding("妳係我的友仔", "UTF-8", "GBK");

?>

再来个GB2312 To Big5

< ?php

header("content-Type: text/html; charset=big5");

echo mb_convert_encoding("你是我的朋友", "big5", "GB2312");

?>

不过要使用上面的函数需要安装但是需要先enable mbstring 扩展库。

PHP中的另外一个函数iconv也是用来转换字符串编码的,与上函数功能相似。

下面还有一些详细的例子:

iconv — Convert string to requested character encoding

(PHP 4 >= 4.0.5, PHP 5)

mb_convert_encoding — Convert character encoding

(PHP 4 >= 4.0.6, PHP 5)

用法:

string mb_convert_encoding ( string str, string to_encoding [, mixed from_encoding] )

需要先enable mbstring 扩展库,在 php.ini里将; extension=php_mbstring.dll 前面的 ; 去掉

mb_convert_encoding 可以指定多种输入编码,它会根据内容自动识别,但是执行效率比iconv差太多;

string iconv ( string in_charset, string out_charset, string str )

注意:第二个参数,除了可以指定要转化到的编码以外,还可以增加两个后缀://TRANSLIT 和 //IGNORE,其中 //TRANSLIT 会自动将不能直接转化的字符变成一个或多个近似的字符,//IGNORE 会忽略掉不能转化的字符,而默认效果是从第一个非法字符截断。

Returns the converted string or FALSE on failure.

使用:

发现iconv在转换字符”—”到gb2312时会出错,如果没有ignore参数,所有该字符后面的字符串都无法被保存。不管怎么样,这个”—”都无法转换成功,无法输出。 另外mb_convert_encoding没有这个bug.

一般情况下用 iconv,只有当遇到无法确定原编码是何种编码,或者iconv转化后无法正常显示时才用mb_convert_encoding 函数.

from_encoding is specified by character code name before conversion. it can be array or string – comma separated enumerated list. If it is not specified, the internal encoding will be used.

/* Auto detect encoding from JIS, eucjp-win, sjis-win, then convert str to UCS-2LE */

$str = mb_convert_encoding($str, “UCS-2LE”, “JIS, eucjp-win, sjis-win”);

/* “auto” is expanded to “ASCII,JIS,UTF-8,EUC-JP,SJIS” */

$str = mb_convert_encoding($str, “EUC-JP”, “auto”);

例子:

$content = iconv(”GBK”, “UTF-8″, $content);

$content = mb_convert_encoding($content, “UTF-8″, “GBK”);

IT技术, php , , ,

php中如何使用explode()

2009年8月15日
php中如何使用explode()已关闭评论

 

explode

(PHP 3, PHP 4, PHP 5)

explode — 使用一个字符串分割另一个字符串

描述

array explode ( string separator, string string [, int limit] )

此函数返回由字符串组成的数组,每个元素都是 string 的一个子串,它们被字符串 separator 作为边界点分割出来。如果设置了 limit 参数,则返回的数组包含最多 limit 个元素,而最后那个元素将包含 string 的剩余部分。

如果 separator 为空字符串(""),explode() 将返回 FALSE。如果 separator 所包含的值在 string 中找不到,那么 explode() 将返回包含 string 单个元素的数组。

如果 limit 参数是负数,则返回除了最后的 limit 个元素外的所有元素。此特性是 PHP 5.1.0 中新增的。

由于历史原因,虽然 implode() 可以接收两种参数顺序,但是 explode() 不行。你必须保证 separator 参数在 string 参数之前才行。

注: 参数 limit 是在 PHP 4.0.1 中加入的。

例子 1. explode() 示例

<?php
// 示例 1
$pizza  = "piece1 piece2 piece3 piece4 piece5 piece6";
$pieces = explode(" ", $pizza);
echo
$pieces[0]; // piece1
echo $pieces[1]; // piece2

// 示例 2
$data = "foo:*:1023:1000::/home/foo:/bin/sh";
list(
$user, $pass, $uid, $gid, $gecos, $home, $shell) = explode(":", $data);
echo
$user; // foo
echo $pass; // *

?>

例子 2. limit 参数示例

<?php
$str
= 'one|two|three|four';

// 正数的 limit
print_r(explode('|', $str, 2));

// 负数的 limit
print_r(explode('|', $str, -1));
?>

以上示例将输出:

Array
(
    [0] => one
    [1] => two|three|four
)
Array
(
    [0] => one
    [1] => two
    [2] => three
)

注: 该函数可安全用于二进制对象。

 

php ,

php如何使用implode()

2009年8月15日
php如何使用implode()已关闭评论

 

定义和用法

implode() 函数把数组元素组合为一个字符串。

语法

implode(separator,array)
参数 描述
separator 可选。规定数组元素之间放置的内容。默认是 ""(空字符串)。
array 必需。要结合为字符串的数组。

说明

虽然 separator 参数是可选的。但是为了向后兼容,推荐您使用使用两个参数。

提示和注释

注释:implode() 可以接收两种参数顺序。但是由于历史原因,explode() 是不行的。你必须保证 separator 参数在 string 参数之前才行。

例子

<?php
$arr = array('How','to','use','implode()');
echo implode(" ",$arr);
?>

输出:

How to use implode()

IT技术, php ,