想要在php程序中执行scp拷贝,之前想用system函数
system("scp /from/path/file user@des_host:/to/path/file"),但是始终失败,
但在命令行下直接执行scp /from/path/file user@des_host:/to/path/file 是OK的,
至今找不到原因,如果哪位知道原因,麻烦告知一下。
既然这个方法不行,就换吧,不能一棵树吊死啊。google来,google去,发现原来php里有
现成的函数:
http://us2.php.net/manual/en/book.ssh2.php
只是要装几个包。
方法如下:
http://us2.php.net/manual/en/ssh2.installation.php
首先要装OpenSSL。
因为自己OpenSSL已经装过了,所以直接第二步,下个libssh2直接安装。
我下的是libssh2-0.18,这个都没什么问题。
第三步要用pear安装php的ssh扩展,如果没装pear可以直接下载源码,自己编译。
http://pecl.php.net/package/ssh2
我下的ssh2-0.10.tgz,解压,编译:
tar -zxvf ssh2-0.10.tgz
【注意源码有些问题,要修改。
把480行
#if LIBSSH2_APINO < 200412301450
…
#else
改为
#if (defined(LIBSSH2_APINO) && LIBSSH2_APINO < 200412301450)
…
#else
把1216行:
#if (LIBSSH2_APINO > 200503221619)
改为
#if (defined(LIBSSH2_APINO) && (LIBSSH2_APINO > 200503221619)) ||
(defined(LIBSSH2_VERSION_NUM) && LIBSSH2_VERSION_NUM >= 0×001000)
】
phpize && ./configure --with-ssh2 && make
编译好,到build文件夹中把ssh2.so cp 到自己的php extension dir中
在php.ini中加入 extension=ssh2.so
重启apache
ok
1. 安装libssh2库
yum install libssh2 libssh2-devel
2. 下载PECL的SSH2支持代码包(beta版本有bug,需patch)
wget http://pecl.php.net/get/ssh2-0.10.tgz
tar xvzf ssh2-0.10.tgz
cd ssh2-0.10
vi ssh2.c
ssh2.c patch方法如下:
LINE 480:
search and change following line:
#if LIBSSH2_APINO < 200412301450
...
#else
to:
#if (defined(LIBSSH2_APINO) && LIBSSH2_APINO < 200412301450)
...
#else
LINE 1216:
search and change following line:
#if (LIBSSH2_APINO > 200503221619)
to:
#if (defined(LIBSSH2_APINO) && (LIBSSH2_APINO > 200503221619)) || (defined(LIBSSH2_VERSION_NUM) && LIBSSH2_VERSION_NUM >= 0x001000)
3. 开始编译
phpize
./configure --with-ssh2
make
4. 加入ssh2扩展到php
cp modules/ssh2.so /usr/lib/php/modules
注意64位系统上是 /usr/lib64
vi php.ini
加入extension=ssh2.so
5. 确认是否已加载
php -i|grep ssh2
结果应该如下所示
# php -i|grep ssh2
Registered PHP Streams => php, file, http, ftp, compress.bzip2, compress.zlib, https, ftps, ssh2.shell, ssh2.exec, ssh2.tunnel, ssh2.scp, ssh2.sftp
ssh2
libssh2 version => 0.17
banner => SSH-2.0-libssh2_0.17
PWD => /root/ssh2-0.10
_SERVER["PWD"] => /root/ssh2-0.10
_ENV["PWD"] => /root/ssh2-0.10
阅读全文
system("scp /from/path/file user@des_host:/to/path/file"),但是始终失败,
但在命令行下直接执行scp /from/path/file user@des_host:/to/path/file 是OK的,
至今找不到原因,如果哪位知道原因,麻烦告知一下。
既然这个方法不行,就换吧,不能一棵树吊死啊。google来,google去,发现原来php里有
现成的函数:
http://us2.php.net/manual/en/book.ssh2.php
只是要装几个包。
方法如下:
http://us2.php.net/manual/en/ssh2.installation.php
首先要装OpenSSL。
因为自己OpenSSL已经装过了,所以直接第二步,下个libssh2直接安装。
我下的是libssh2-0.18,这个都没什么问题。
第三步要用pear安装php的ssh扩展,如果没装pear可以直接下载源码,自己编译。
http://pecl.php.net/package/ssh2
我下的ssh2-0.10.tgz,解压,编译:
tar -zxvf ssh2-0.10.tgz
【注意源码有些问题,要修改。
把480行
#if LIBSSH2_APINO < 200412301450
…
#else
改为
#if (defined(LIBSSH2_APINO) && LIBSSH2_APINO < 200412301450)
…
#else
把1216行:
#if (LIBSSH2_APINO > 200503221619)
改为
#if (defined(LIBSSH2_APINO) && (LIBSSH2_APINO > 200503221619)) ||
(defined(LIBSSH2_VERSION_NUM) && LIBSSH2_VERSION_NUM >= 0×001000)
】
phpize && ./configure --with-ssh2 && make
编译好,到build文件夹中把ssh2.so cp 到自己的php extension dir中
在php.ini中加入 extension=ssh2.so
重启apache
ok
1. 安装libssh2库
yum install libssh2 libssh2-devel
2. 下载PECL的SSH2支持代码包(beta版本有bug,需patch)
wget http://pecl.php.net/get/ssh2-0.10.tgz
tar xvzf ssh2-0.10.tgz
cd ssh2-0.10
vi ssh2.c
ssh2.c patch方法如下:
LINE 480:
search and change following line:
#if LIBSSH2_APINO < 200412301450
...
#else
to:
#if (defined(LIBSSH2_APINO) && LIBSSH2_APINO < 200412301450)
...
#else
LINE 1216:
search and change following line:
#if (LIBSSH2_APINO > 200503221619)
to:
#if (defined(LIBSSH2_APINO) && (LIBSSH2_APINO > 200503221619)) || (defined(LIBSSH2_VERSION_NUM) && LIBSSH2_VERSION_NUM >= 0x001000)
3. 开始编译
phpize
./configure --with-ssh2
make
4. 加入ssh2扩展到php
cp modules/ssh2.so /usr/lib/php/modules
注意64位系统上是 /usr/lib64
vi php.ini
加入extension=ssh2.so
5. 确认是否已加载
php -i|grep ssh2
结果应该如下所示
# php -i|grep ssh2
Registered PHP Streams => php, file, http, ftp, compress.bzip2, compress.zlib, https, ftps, ssh2.shell, ssh2.exec, ssh2.tunnel, ssh2.scp, ssh2.sftp
ssh2
libssh2 version => 0.17
banner => SSH-2.0-libssh2_0.17
PWD => /root/ssh2-0.10
_SERVER["PWD"] => /root/ssh2-0.10
_ENV["PWD"] => /root/ssh2-0.10

陀振华 10:04:12
图标的话,你得到网上找
陀振华 10:04:24
然后自己替换他exe资源里的图。
陀振华 10:04:39
或看有没人做过这种皮肤。

回忆未来 10:11:06
啊真好
---
你那个搜索框咋出来的呢?快捷键吗
陀振华 10:11:20
- -; 不用快捷键....直接输入
和windows一样的图标设置:


右键出现菜单设置:

设置:

Download:
https://uploadocean.com/r4zbx4olj9ra
Download:http://download2.uploadocean.com:182/d/4tvrc2xk2tslvrtxiv5lkfbcf6wagmsmtrpfvhhq2ut6fvgep7k7vhwueszunu3iklwi3ckp/Total%20Commander%209.12%20Setup%20+%20Crack.rar AddTime:2018/08/13
Total Commander(9.20)美化增强便携版
百度网盘:https://pan.baidu.com/s/15SLv5baXcQRsijQqAK-0BQ 密码:o110
蓝奏网盘:https://www.lanzous.com/b287174/ 密码:ccava
图标的话,你得到网上找
陀振华 10:04:24
然后自己替换他exe资源里的图。
陀振华 10:04:39
或看有没人做过这种皮肤。
回忆未来 10:11:06
啊真好
---
你那个搜索框咋出来的呢?快捷键吗
陀振华 10:11:20
- -; 不用快捷键....直接输入
和windows一样的图标设置:
右键出现菜单设置:
设置:
Download:
https://uploadocean.com/r4zbx4olj9ra
Download:http://download2.uploadocean.com:182/d/4tvrc2xk2tslvrtxiv5lkfbcf6wagmsmtrpfvhhq2ut6fvgep7k7vhwueszunu3iklwi3ckp/Total%20Commander%209.12%20Setup%20+%20Crack.rar AddTime:2018/08/13
Total Commander(9.20)美化增强便携版
百度网盘:https://pan.baidu.com/s/15SLv5baXcQRsijQqAK-0BQ 密码:o110
蓝奏网盘:https://www.lanzous.com/b287174/ 密码:ccava
minicom是linux下串口通信的软件,它的使用完全依靠键盘的操作,虽然没有“超级终端”那么易用,但是使用习惯之后读者将会体会到它的高效与便利,下面将讲解minicom的安装和配置。
阅读全文

开始拉~,话说在css+div的年代里,网页布局成了代码高手的专利,没有点底子的人还真搞不定css+div,还是老老实实的table套table吧。table虽然不符合这标准,不符合那个标准,不过在布局方面确实还是宝刀不老的说。不过,必经是一个过去的时代的东西了,现在就说说如何让一个div实现底部对齐
<style>
#parent{
width:300px;
height:300px;
background:gray;
}
#i_want_to_be_bottom{
width:100px;
height:30px;
background:red;
}
</style>
<div id="parent">
<div id="i_want_to_be_bottom"></div>
</div>

变动后代码:
<style>
#parent{
width:300px;
height:300px;
background:gray;
position:relative;
}
#i_want_to_be_bottom{
width:100px;
height:30px;
background:red;
position:absolute;
bottom:0px;
}
</style>
<div id="parent">
<div id="i_want_to_be_bottom"></div>
</div>

三、变动点提示
#parent{
....
postion:relative;
....
}
#i_want_to_be_bottom{
....
position:absolute;
bottom:0px;
....
}
提示:一个是relative ,一个是absolute,bottom:0px,这三个点!
四、写在最后
当然,你也可以设置子div的margin选项达到底对齐的目的,但是如果父div的高度是可变的时候,这样做就不行了。所以,达到子div底对齐的万能办法是使用如上所述办法,当然,有的时候,你可以使用子div的right:0px来达到右对齐的目的。
来源:http://blog.sina.com.cn/s/blog_4c4a58ca01000bed.html
<style>
#parent{
width:300px;
height:300px;
background:gray;
}
#i_want_to_be_bottom{
width:100px;
height:30px;
background:red;
}
</style>
<div id="parent">
<div id="i_want_to_be_bottom"></div>
</div>
变动后代码:
<style>
#parent{
width:300px;
height:300px;
background:gray;
position:relative;
}
#i_want_to_be_bottom{
width:100px;
height:30px;
background:red;
position:absolute;
bottom:0px;
}
</style>
<div id="parent">
<div id="i_want_to_be_bottom"></div>
</div>
三、变动点提示
#parent{
....
postion:relative;
....
}
#i_want_to_be_bottom{
....
position:absolute;
bottom:0px;
....
}
提示:一个是relative ,一个是absolute,bottom:0px,这三个点!
四、写在最后
当然,你也可以设置子div的margin选项达到底对齐的目的,但是如果父div的高度是可变的时候,这样做就不行了。所以,达到子div底对齐的万能办法是使用如上所述办法,当然,有的时候,你可以使用子div的right:0px来达到右对齐的目的。
来源:http://blog.sina.com.cn/s/blog_4c4a58ca01000bed.html
插件的名字:StatusbarEx
首先,我的局域网中有windowsXP简体中文主机、windowsHOME繁体中文主机两种,都通过samba共享linux服务器的资源,服务器是UBUNTU 8.04。
当samba服务器搭建好后,windows主机无法通过网上邻居映射ubuntu共享出来的文件夹,需要在“运行”中输入服务器ip方可,如:\\192.168.1.107\temp。此时提示输入用户名和密码,这时Ubuntu开放给局域网的账号,当每次开机都需要输入一次进行重连,麻烦啊
解决办法
1、windowXP主机
(1)添加网路密码选项可用。“控制面板-》用户帐户-》选择一个用户-》管理我的网路密码-》添加”即可。使用这个账号重新映射服务器文件夹即可自动重连。
(2)添加网路密码选项不可用。
开始->设置->控制面板->管理工具->本地安全策略->本地策略->安全选项->网络访问:不允许为网络身份验证储存凭据或.NET Passports 设置为"已停用。重启系统,即可看到“管理我的网路密码-》添加”选项
2、windowHOME主机
由于windowHOME系统功能严重不足,没有“本地安全策略”功能,所有只能将系统的当前用户修改为服务器共享的用户才行,然后使用“优化大师”等软件设置开机自动登录,免去登录系统时输入账号密码的麻烦。
如下:

阅读全文
当samba服务器搭建好后,windows主机无法通过网上邻居映射ubuntu共享出来的文件夹,需要在“运行”中输入服务器ip方可,如:\\192.168.1.107\temp。此时提示输入用户名和密码,这时Ubuntu开放给局域网的账号,当每次开机都需要输入一次进行重连,麻烦啊
解决办法
1、windowXP主机
(1)添加网路密码选项可用。“控制面板-》用户帐户-》选择一个用户-》管理我的网路密码-》添加”即可。使用这个账号重新映射服务器文件夹即可自动重连。
(2)添加网路密码选项不可用。
开始->设置->控制面板->管理工具->本地安全策略->本地策略->安全选项->网络访问:不允许为网络身份验证储存凭据或.NET Passports 设置为"已停用。重启系统,即可看到“管理我的网路密码-》添加”选项
2、windowHOME主机
由于windowHOME系统功能严重不足,没有“本地安全策略”功能,所有只能将系统的当前用户修改为服务器共享的用户才行,然后使用“优化大师”等软件设置开机自动登录,免去登录系统时输入账号密码的麻烦。
如下:

http://www.51testing.com/?uid-149221-action-viewspace-itemid-70537
自从web2.0的浪潮开始,国内做互联网的公司言必称用户体验,动辄拿苹果公司的产品,或者早期的豆瓣用来做例子,证明用户体验是多么重要。这几年各大互联网公司纷纷设立了单独的用户体验部门,开了UE/UX的官方博客,一派热热闹闹的用户体验大潮就这样拉开了。
阅读全文

//手机号码验证函数 目前我国的手机号是130-139,150-159开头的都有了,3G的是187,188,189,是这样子的吧
function MobileTest(Mobile_str)
{
var reg = /^1(3|5)\d{9}|18[789]\d{8}$/;
return reg.test(Mobile_str);
}
{
var reg = /^1(3|5)\d{9}|18[789]\d{8}$/;
return reg.test(Mobile_str);
}
I have set Total Commander > Configuration > Options > Operation >
Edit/View .. via F4 button .. to launch and display files in
EditPlus as default Editor.
Editor:D:\Program Files\EditPlus\editplus.exe
中文:设置> 选项> 操作> 查看> 编辑
crontab -l > /home/enrnd/crontab_bak/crontab_bak`date '+%Y%m%d'`.txt
为了不引起混淆,验证码通常是大写的,因为小写的“l”很容易让输入者误以为是“1”,造成不必要的麻烦。
虽然说判断验证码时都是忽略大小写的,但用户可能不知道,他可能要按住 Shift 键去照着图片的大写来输,为了给使用者带来方便,可使用下面的代码:
<input type="text" name="code" style="text-transform:uppercase;">
利用 text-transform 就可以让用户在输入验证码时自动大写了,不论用户是否按住了 Shift 键。
虽然说判断验证码时都是忽略大小写的,但用户可能不知道,他可能要按住 Shift 键去照着图片的大写来输,为了给使用者带来方便,可使用下面的代码:
<input type="text" name="code" style="text-transform:uppercase;">
利用 text-transform 就可以让用户在输入验证码时自动大写了,不论用户是否按住了 Shift 键。
1、安装: pkg_add -rv minicom
2、安装完成后,# rehash,然后运行# minicom 进行配置。配置和使用前最好查询一下minicom的man页,学习一下
它的键盘操作命令。注意,如果在/usr/local/etc/minicom/下没有etc目录,就要新建一个,用于保存配置文件。
3、进入minocom界面后,按Ctrl+A调出命令模式后,再按o命令,进入配置菜单。主要调整两样,一个是串口号,一个是波特率。
我的配置是:串口设置填/dev/cuad0,波特率部份填9600 8N1。
4、配置后,选择“Save setup as...”把它存为cisco。用X命令退出minicom。
5、用串行线连接电脑串口与交换机的控制口(Console)后,用# minicom 进入minicom即可。
2、安装完成后,# rehash,然后运行# minicom 进行配置。配置和使用前最好查询一下minicom的man页,学习一下
它的键盘操作命令。注意,如果在/usr/local/etc/minicom/下没有etc目录,就要新建一个,用于保存配置文件。
3、进入minocom界面后,按Ctrl+A调出命令模式后,再按o命令,进入配置菜单。主要调整两样,一个是串口号,一个是波特率。
我的配置是:串口设置填/dev/cuad0,波特率部份填9600 8N1。
4、配置后,选择“Save setup as...”把它存为cisco。用X命令退出minicom。
5、用串行线连接电脑串口与交换机的控制口(Console)后,用# minicom 进入minicom即可。
__get __set魔术引用之我见,以及常用可替代的setParam 方法。
Php/Js/Shell/Go jackxiang 2010-3-3 18:57
__get和__set类似于.net中的属性访问器,用于给类中的私有字段赋值。但注意,一般这种方式只能给一个字段赋值,当你的类中有多个字段的时候,建议使用function getProperty(){}和function setProperty(value)的形式(类似于java)。
所以上述代码你使用的方式完全错误:
class Employee
{
$name
public function __get()
{
return $name;//取得私有字段的值
}
public function __set($propValue)
{
this->$name = $propValue;//给私有字段赋值
}
}
事实上 JAVA等OOP语言中都是将属性设置为private的,其原因就是属性属于对象自身,所以不应该直接通过外界修改(会破坏对象自身的封装),之所以有魔术方法其实是为了通过某种接口来实现特定的属性修改(也就是符合某种条件才能对自身的属性进行修改),事实上对于java来说是采用的手动设置以及获取的方式设置,php中就更为简单了,提供了魔术方法来实现,另外提供__setter和__getter是魔术方法在某些设计模式中也有用到,这可能被设计为动态属性,也就是可以为对象在外部提供属性,而不需要在定义类时定义。
1.不一定是私有属性, :__get() is utilized for reading data from inaccessible members.
2.可以在__get中增加很多逻辑,有可能你用类中的一个数组类型的变量存了很多值,__get的时候,可以根据数组的key来取值,所以不一定是直接访问某个变量
3.你不设置__get函数的时候,不可访问的变量是受保护的
具体运用:
应该说 getter和setter的作用,最大的原因是为了让变量的修改和获取“可控”
在给属性赋值的时候,通过setter可以先对赋过来的值做一次合法性检查,以避免后面可能出现的错误!
在一个php框架中具体运用,我这人把它从我们的框架中抽离了出来示意一下:
下载文件
————————————————用setParam 方法实现代码片段示例———————————————————————
getParam方法:
————————————————用__set和__get方法—————————————————
Result:
---------- 调试PHP ----------
TMController Object
(
[abc] => Array
(
[weekscore] => ab
)
)
scoreController Object
(
[abc] => Array
(
[weekscore] => abc
)
)
输出完成 (耗时 0 秒) - 正常终止
所以上述代码你使用的方式完全错误:
class Employee
{
$name
public function __get()
{
return $name;//取得私有字段的值
}
public function __set($propValue)
{
this->$name = $propValue;//给私有字段赋值
}
}
事实上 JAVA等OOP语言中都是将属性设置为private的,其原因就是属性属于对象自身,所以不应该直接通过外界修改(会破坏对象自身的封装),之所以有魔术方法其实是为了通过某种接口来实现特定的属性修改(也就是符合某种条件才能对自身的属性进行修改),事实上对于java来说是采用的手动设置以及获取的方式设置,php中就更为简单了,提供了魔术方法来实现,另外提供__setter和__getter是魔术方法在某些设计模式中也有用到,这可能被设计为动态属性,也就是可以为对象在外部提供属性,而不需要在定义类时定义。
1.不一定是私有属性, :__get() is utilized for reading data from inaccessible members.
2.可以在__get中增加很多逻辑,有可能你用类中的一个数组类型的变量存了很多值,__get的时候,可以根据数组的key来取值,所以不一定是直接访问某个变量
3.你不设置__get函数的时候,不可访问的变量是受保护的
具体运用:
应该说 getter和setter的作用,最大的原因是为了让变量的修改和获取“可控”
在给属性赋值的时候,通过setter可以先对赋过来的值做一次合法性检查,以避免后面可能出现的错误!
在一个php框架中具体运用,我这人把它从我们的框架中抽离了出来示意一下:

————————————————用setParam 方法实现代码片段示例———————————————————————
getParam方法:
————————————————用__set和__get方法—————————————————
Result:
---------- 调试PHP ----------
TMController Object
(
[abc] => Array
(
[weekscore] => ab
)
)
scoreController Object
(
[abc] => Array
(
[weekscore] => abc
)
)
输出完成 (耗时 0 秒) - 正常终止
$_ENV记载了一些系统环境变量(因为牵扯到实际的操作系统,所以不可能给出$_ENV的完整列表)。
但有些朋友的$_ENV是空的,可能是原因是:
你的php.ini的variables_order值为"GPCS",也就是说系统在定义 PHP预定义变量时的顺序是GET,POST,COOKIES,SERVER,没有定义Environment(E),你可以修改php.ini文件的 variables_order值为你想要的顺序,如:"EGPCS"。这时,$_ENV的值就可以取得了
EGPCS值(EGPCS是Environment、Get、Post、Cookies、Server的缩写 -- 这是PHP中外部变量来源的全部范围)
修改一下:
root@raspberrypi:/data/htdocs/t.jackxiang.com# /usr/bin/php -r "phpinfo();"|grep php.ini
Loaded Configuration File => /etc/php5/cli/php.ini
打开这个选项:
; Default Value: "EGPCS"
; Development Value: "GPCS"
; Production Value: "GPCS";
; http://php.net/variables-order
; variables_order = "GPCS"
variables_order = "EGPCS"
PHP中的$_ENV :来自:http://blog.sina.com.cn/s/blog_a6bbf41e010169xl.html
============================================================================
PHP中的$_ENV是一个包含服务器端环境变量的数组。它是PHP中一个超级全局变量,我们可以在PHP 程序的任何地方直接访问它。
$_ENV只是被动的接受服务器端的环境变量并把它们转换为数组元素,你可以尝试直接输出它。
当你想看看一个变量中究竟有什么东西在里面时,我所知道的方式有三种:
1、var_dump($_ENV);
2、print_r($_ENV);
3、foreach($_ENV as $key=>$val){echo $key.'--------'.$val.'<br>';}
这三种方式中,第一种我觉得最方便而且输出的内容格式清晰。
由于$_ENV变量是取决于服务器的环境变量的,从不同的服务器上获取的$_ENV变量打印出的结果可能是完全不同的。所以无法像$_SERVER 那样列出完整的列表。以下是$_ENV 数组包含的比较通用的元素:
有时候,$_ENV会为空,其原因通常是php的配置文件php.ini的配置项为:variables_order = "GPCS"。要想让$_ENV的值不为空,那么variables_order的值应该加上一个大写字母“E”,即:variables_order = "EGPCS"。
上述配置表示了PHP接受的外部变量来源及顺序,EGPCS是Environment、Get、Post、Cookies、Server的缩写。如果variables_order 的配置中缺少E ,则PHP 无法接受环境变量,那么$_ENV 也就为空了。
由于开启$_ENV,即variables_order = "EGPCS"会导致一些性能损失,按php官方的说法是,在生产环境中,不推荐使用。他们更推荐使用getenv (string $varname)函数来获取Environment中的值,而这点需要在编程时就注意到。如果编程时用了$_ENV而variables_order中又没有配置为variables_order = "EGPCS",则程序运行时可能会报错。
但有些朋友的$_ENV是空的,可能是原因是:
你的php.ini的variables_order值为"GPCS",也就是说系统在定义 PHP预定义变量时的顺序是GET,POST,COOKIES,SERVER,没有定义Environment(E),你可以修改php.ini文件的 variables_order值为你想要的顺序,如:"EGPCS"。这时,$_ENV的值就可以取得了
EGPCS值(EGPCS是Environment、Get、Post、Cookies、Server的缩写 -- 这是PHP中外部变量来源的全部范围)
修改一下:
root@raspberrypi:/data/htdocs/t.jackxiang.com# /usr/bin/php -r "phpinfo();"|grep php.ini
Loaded Configuration File => /etc/php5/cli/php.ini
打开这个选项:
; Default Value: "EGPCS"
; Development Value: "GPCS"
; Production Value: "GPCS";
; http://php.net/variables-order
; variables_order = "GPCS"
variables_order = "EGPCS"
/usr/local/php/bin/php -r "phpinfo();"|grep variables_order
variables_order => EGPCS => EGPCS
variables_order => EGPCS => EGPCS
PHP中的$_ENV :来自:http://blog.sina.com.cn/s/blog_a6bbf41e010169xl.html
============================================================================
PHP中的$_ENV是一个包含服务器端环境变量的数组。它是PHP中一个超级全局变量,我们可以在PHP 程序的任何地方直接访问它。
$_ENV只是被动的接受服务器端的环境变量并把它们转换为数组元素,你可以尝试直接输出它。
当你想看看一个变量中究竟有什么东西在里面时,我所知道的方式有三种:
1、var_dump($_ENV);
2、print_r($_ENV);
3、foreach($_ENV as $key=>$val){echo $key.'--------'.$val.'<br>';}
这三种方式中,第一种我觉得最方便而且输出的内容格式清晰。
由于$_ENV变量是取决于服务器的环境变量的,从不同的服务器上获取的$_ENV变量打印出的结果可能是完全不同的。所以无法像$_SERVER 那样列出完整的列表。以下是$_ENV 数组包含的比较通用的元素:
有时候,$_ENV会为空,其原因通常是php的配置文件php.ini的配置项为:variables_order = "GPCS"。要想让$_ENV的值不为空,那么variables_order的值应该加上一个大写字母“E”,即:variables_order = "EGPCS"。
上述配置表示了PHP接受的外部变量来源及顺序,EGPCS是Environment、Get、Post、Cookies、Server的缩写。如果variables_order 的配置中缺少E ,则PHP 无法接受环境变量,那么$_ENV 也就为空了。
由于开启$_ENV,即variables_order = "EGPCS"会导致一些性能损失,按php官方的说法是,在生产环境中,不推荐使用。他们更推荐使用getenv (string $varname)函数来获取Environment中的值,而这点需要在编程时就注意到。如果编程时用了$_ENV而variables_order中又没有配置为variables_order = "EGPCS",则程序运行时可能会报错。
一开始在网上找资料,最多是《Linux Serial HOWTO 中譯版》,浏览地址:http://linux.cis.nctu.edu.tw/chinese/how-to/Serial-HOWTO.html。以及众多这个版本的摘选,内容是大同小异的。
后来发现,其实串口编程的实质就是多串口属性的设置。
而属性也就下面这么几个:
c_cflag Control options
c_lflag Line options
c_iflag Input options
c_oflag Output options
c_cc Control characters
c_ispeed Input baud (new interface)
c_ospeed Output baud (new interface)
关键是理解有那些属性参数可以设置以及是什么意思。
继续找资料。发现下面的经典文章,可以说基本上所有的串口编程的文章都或多或少的参考了这篇文章,《Serial Programming Guide for POSIX Operating Systems》是一定要看的,我读的是5th Edition, 3rd Revision - Updated March 11, 2003,下载地址:http://www.easysw.com/~mike/serial/index.html
当把这篇文章看完之后,基本可以解决串口的设置问题了。不过这是一个英文的版本,本人打算在暑假里把他翻译为中文版本。
关于具体的例子:
http://www.comptechdoc.org/os/linux/programming/c/linux_pgcserial.html不错,很详细,不过比较复杂。
中文的《Linux Serial HOWTO 中譯版》上面就有不少,也很值得参考。
下面的是我的程序,一个串口读取,往mysql数据库写数据的程序:
串口相关资料:
下载文件
后来发现,其实串口编程的实质就是多串口属性的设置。
而属性也就下面这么几个:
c_cflag Control options
c_lflag Line options
c_iflag Input options
c_oflag Output options
c_cc Control characters
c_ispeed Input baud (new interface)
c_ospeed Output baud (new interface)
关键是理解有那些属性参数可以设置以及是什么意思。
继续找资料。发现下面的经典文章,可以说基本上所有的串口编程的文章都或多或少的参考了这篇文章,《Serial Programming Guide for POSIX Operating Systems》是一定要看的,我读的是5th Edition, 3rd Revision - Updated March 11, 2003,下载地址:http://www.easysw.com/~mike/serial/index.html
当把这篇文章看完之后,基本可以解决串口的设置问题了。不过这是一个英文的版本,本人打算在暑假里把他翻译为中文版本。
关于具体的例子:
http://www.comptechdoc.org/os/linux/programming/c/linux_pgcserial.html不错,很详细,不过比较复杂。
中文的《Linux Serial HOWTO 中譯版》上面就有不少,也很值得参考。
下面的是我的程序,一个串口读取,往mysql数据库写数据的程序:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <errno.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "mysql.h"
#define BAUDRATE B9600
#define DEVICE "/dev/ttyS0"
#define _POSIX_SOURCE 1
#define FALSE 0
#define TRUE 1
int insertdb(int d1, int d2, int d3, int d4) {
MYSQL connect;
int res, no1, no2, sd1, sd2;
char *query = "INSERT INTO mydata ( stime, sno1, sno2, sdata1, sdata2 ) VALUES ( '%s', %d, %d, %x, %x)";
char *sql, *st1;
struct tm *ptr;
time_t lt;
no1 = d1;
no2 = d2;
sd1 = d3;
sd2 = d4;
lt = time(NULL);
ptr = localtime(<);
st1 = (char *)asctime(ptr);
st1[strlen(st1) -1 ] = '\0';
sql = (char *)malloc(255*sizeof(char));
sprintf(sql, query, st1, no1, no2, sd1, sd2);
/* debug here
printf("%c : ", st1[strlen(st1)]);
printf("%s : %d :",sql, strlen(st1));
return EXIT_SUCCESS;
*/
mysql_init(&connect);
if(mysql_real_connect(&connect, "localhost", "root", "root", "mytest", 0, NULL, 0)) {
printf("connect success!\n");
res = mysql_query(&connect, sql);
if(!res) {
printf("insert success!\n");
} else {
fprintf(stderr, "insert error %d: %s\n", mysql_errno(&connect), mysql_error(&connect));
return EXIT_FAILURE;
}
mysql_close(&connect);
} else {
fprintf(stderr, "connect fail!\n");
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
int main(void) {
int fd, res_w, res_r, i, j, k;
struct termios oldtio,newtio;
char inbuf[255];
char cbuf[4];
int buf[4];
res_w = 0;
res_r = 0;
fd = open(DEVICE, O_RDWR | O_NOCTTY ); // | O_NDELAY);
if(fd < 0) {
perror(DEVICE);
exit(-1);
}
tcgetattr(fd, &oldtio);
bzero(&newtio,sizeof(struct termios));
newtio.c_cflag|= (CLOCAL | CREAD);
newtio.c_cflag|=BAUDRATE;
newtio.c_cflag&=~CSTOPB;
newtio.c_cflag&=~PARENB;
newtio.c_cflag&=~CSIZE;
newtio.c_cflag|=CS8;
newtio.c_cflag&=~CRTSCTS;
newtio.c_lflag=0;
newtio.c_oflag=0;
newtio.c_cc[VMIN]=4;
newtio.c_cc[VTIME]=0;
newtio.c_iflag&=~(IXON|IXOFF|IXANY);
cfsetispeed(&newtio, BAUDRATE);
cfsetospeed(&newtio, BAUDRATE);
tcsetattr(fd, TCSANOW, &newtio);
tcflush(fd, TCIFLUSH);
cbuf[0] = 0x00;
// cbuf[1] = 0x00;
j = 0;
for(k = 0; k < 4; k++) {
switch (j) {
case 0:
default:
cbuf[1] = 0x00;
j = 2;
break;
case 2:
cbuf[1] = 0x02;
j = 0;
break;
}
res_w = write(fd, cbuf, 2);
/* debug here
printf("cbuf : %x %x \n", cbuf[0], cbuf[1]);
printf("buf : %x : %x : %x : %x \n", inbuf[0], inbuf[1], inbuf[2], inbuf[3]);
*/
res_r = read(fd, &inbuf, 255);
if(res_r != -1) {
for(i = 0; i < res_r; i++) {
buf[i] = (int)inbuf[i];
buf[i] = buf[i] & 0xff;
// printf(" %x ", buf[i]);
}
printf("\n");
if(insertdb(buf[0], buf[1], buf[2], buf[3]))
printf("insert into db success!");
}
else {
perror("read fail");
exit(-1);
}// if end here
}// for end here
tcsetattr(fd, TCSANOW, &oldtio);
close(fd);
exit(0);
} // main end here
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <errno.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "mysql.h"
#define BAUDRATE B9600
#define DEVICE "/dev/ttyS0"
#define _POSIX_SOURCE 1
#define FALSE 0
#define TRUE 1
int insertdb(int d1, int d2, int d3, int d4) {
MYSQL connect;
int res, no1, no2, sd1, sd2;
char *query = "INSERT INTO mydata ( stime, sno1, sno2, sdata1, sdata2 ) VALUES ( '%s', %d, %d, %x, %x)";
char *sql, *st1;
struct tm *ptr;
time_t lt;
no1 = d1;
no2 = d2;
sd1 = d3;
sd2 = d4;
lt = time(NULL);
ptr = localtime(<);
st1 = (char *)asctime(ptr);
st1[strlen(st1) -1 ] = '\0';
sql = (char *)malloc(255*sizeof(char));
sprintf(sql, query, st1, no1, no2, sd1, sd2);
/* debug here
printf("%c : ", st1[strlen(st1)]);
printf("%s : %d :",sql, strlen(st1));
return EXIT_SUCCESS;
*/
mysql_init(&connect);
if(mysql_real_connect(&connect, "localhost", "root", "root", "mytest", 0, NULL, 0)) {
printf("connect success!\n");
res = mysql_query(&connect, sql);
if(!res) {
printf("insert success!\n");
} else {
fprintf(stderr, "insert error %d: %s\n", mysql_errno(&connect), mysql_error(&connect));
return EXIT_FAILURE;
}
mysql_close(&connect);
} else {
fprintf(stderr, "connect fail!\n");
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
int main(void) {
int fd, res_w, res_r, i, j, k;
struct termios oldtio,newtio;
char inbuf[255];
char cbuf[4];
int buf[4];
res_w = 0;
res_r = 0;
fd = open(DEVICE, O_RDWR | O_NOCTTY ); // | O_NDELAY);
if(fd < 0) {
perror(DEVICE);
exit(-1);
}
tcgetattr(fd, &oldtio);
bzero(&newtio,sizeof(struct termios));
newtio.c_cflag|= (CLOCAL | CREAD);
newtio.c_cflag|=BAUDRATE;
newtio.c_cflag&=~CSTOPB;
newtio.c_cflag&=~PARENB;
newtio.c_cflag&=~CSIZE;
newtio.c_cflag|=CS8;
newtio.c_cflag&=~CRTSCTS;
newtio.c_lflag=0;
newtio.c_oflag=0;
newtio.c_cc[VMIN]=4;
newtio.c_cc[VTIME]=0;
newtio.c_iflag&=~(IXON|IXOFF|IXANY);
cfsetispeed(&newtio, BAUDRATE);
cfsetospeed(&newtio, BAUDRATE);
tcsetattr(fd, TCSANOW, &newtio);
tcflush(fd, TCIFLUSH);
cbuf[0] = 0x00;
// cbuf[1] = 0x00;
j = 0;
for(k = 0; k < 4; k++) {
switch (j) {
case 0:
default:
cbuf[1] = 0x00;
j = 2;
break;
case 2:
cbuf[1] = 0x02;
j = 0;
break;
}
res_w = write(fd, cbuf, 2);
/* debug here
printf("cbuf : %x %x \n", cbuf[0], cbuf[1]);
printf("buf : %x : %x : %x : %x \n", inbuf[0], inbuf[1], inbuf[2], inbuf[3]);
*/
res_r = read(fd, &inbuf, 255);
if(res_r != -1) {
for(i = 0; i < res_r; i++) {
buf[i] = (int)inbuf[i];
buf[i] = buf[i] & 0xff;
// printf(" %x ", buf[i]);
}
printf("\n");
if(insertdb(buf[0], buf[1], buf[2], buf[3]))
printf("insert into db success!");
}
else {
perror("read fail");
exit(-1);
}// if end here
}// for end here
tcsetattr(fd, TCSANOW, &oldtio);
close(fd);
exit(0);
} // main end here
串口相关资料:
