2018-09-01 15:49:58 qintaiwu 阅读数 1056
  • C++中搭建Lua脚本系统开发框架,并实现OpenGL调用

    1.如何编译lua 2.C++ 中调用lua函数 3.lua中如何调用C++函数 4.深入的介绍lua栈(lua的灵魂) 5.lua闭包和上值的使用 6.lua元表的使用(lua的精髓) 7.实现导出C++类给lua 8.实现自动化导出类给lua 9.导出OpenGL函数库给lua 10.游戏循环中调用lua,实现OpenGL绘制.

    3987 人正在学习 去看看 张立铜

【导读】

在编程开发过程中,有时候难免会需要调用Linux系统下的 Shell 命令来辅助完成一些相关的操作,那么在 PHP 编程开发中如何才能调用系统下的shell命令呢?

下面介绍3种调用的方法:  shell_exec( )、system( )、exec( )

【实际操作】

(1)shell_exec( "command")

功能:将指令传至系统的shell中执行,并返回其执行结果。

例子:

<?php
$result = shell_exec("ls");
echo $result;
?>

(2)system("command", $out)

功能:将指令传至系统的shell中执行,并返回(显示)结果。

返回:$out参数为可选参数,加载时会返回命令的" 执行结果 "和" 执行状态码 ",状态码: 0:成功,1:失败!

例子:

<?php 
$a = system("dir", $out); 
print_r($a); 
print_r($out);
?> 

(3)exec("command", $out, $status)

功能:将指令传至系统的shell中执行,结果返回到$out中,$status为执行状态【0:成功,1:失败】。

例子:

<?php 
$a = exec("ls",$out,$status); 
print_r($a); 
print_r($out); 
print_r($status); 
?> 

PS:执行时,注意文件的权限问题。

2013-10-17 15:15:55 kuailefangyuan 阅读数 865
  • C++中搭建Lua脚本系统开发框架,并实现OpenGL调用

    1.如何编译lua 2.C++ 中调用lua函数 3.lua中如何调用C++函数 4.深入的介绍lua栈(lua的灵魂) 5.lua闭包和上值的使用 6.lua元表的使用(lua的精髓) 7.实现导出C++类给lua 8.实现自动化导出类给lua 9.导出OpenGL函数库给lua 10.游戏循环中调用lua,实现OpenGL绘制.

    3987 人正在学习 去看看 张立铜

当需要在PHP中通过url调用现有的java中的服务的时候,以下是一个简单的demo范例。

核心代码:调用函数

 /**
    * php通过url调用java服务
    * Enter description here ...
    * @param unknown_type $url
    * @param unknown_type $data
    */
function _http_curl_post($url,$data)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 4);
curl_setopt($ch, CURLOPT_TIMEOUT,4);


if($data){
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "value=".json_encode($data));  //请求参数转为json格式
}
curl_setopt($ch, CURLOPT_HEADER, false);
$string = curl_exec($ch);
curl_close($ch);
return $string;
}

以下是一个调用上述函数的一个范例:
  /**
    * 调取用户在睿道在线中的学习记录,仅显示前30条
    * Enter description here ...
    */
public function neusoft(){

        $uid = intval($_GET['uid']);
// $url="http://www.neuedu.cn/php/php!index.action?userId=".$uid;
        $url="http://localhost:8080/NeuOnline/php/php!index.action?userId=10064";
        $params = array(); 
//        $params['userId']       = 1 ;   暂不起作用,待进一步探究
$data = $this->_http_curl_post($url,$params); 
        $list = json_decode($data,TRUE);
        //dump($list);
        $arrs=array_chunk($list,10);  //每10条为一组
        $this->assign('list',$arrs[0]);// 赋值数据集
        
        //dump($arrs);
        //设置tab页信息
        $d['type'] = t($_GET['type']) ? t($_GET['type']) : 'neusoft';
$d['feed_type'] = t($_GET['feed_type']) ? t($_GET['feed_type']) : '';
$d['feed_key'] = t($_GET['feed_key']) ? t($_GET['feed_key']) : '';
// 判断频道是否开启
$isChannelOpen = model('App')->isAppNameOpen('channel');
$this->assign('isChannelOpen', $isChannelOpen);
// 关注的频道
if($isChannelOpen && $d['type'] === 'channel') {
$d['channelname'] = '我关注的频道';
$d['channelGroup'] = D('ChannelFollow', 'channel')->getFollowList($this->mid);
foreach($d['channelGroup'] as $v) {
if($v['channel_category_id'] == t($_REQUEST['fgid'])) {
$d['channelname'] = $v['title'];
break;
}
}
}
        $this->assign($d);
        $this->assign("type","neusoft");
        $this->assign("max",sizeof($arrs));
$this->display('index'); // 输出模板  
}


二、在java中调用php的action并传递参数

/**
* 调用指定的url,并且传输参数,获取请求结果

* @param url
* @return
* @throws Exception
*/
public String connectionURL(String url,String param) throws Exception {

HttpURLConnection connection = null;
         BufferedReader in = null;
StringBuffer sbinner=new StringBuffer();;
try {
connection = (HttpURLConnection) new URL(url).openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
connection.setRequestMethod("POST");
connection.setReadTimeout(300*1000);
connection.setConnectTimeout(300*1000);
connection.setRequestProperty("Content-Length", Integer.toString(param.getBytes().length));
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

OutputStream outputStream = connection.getOutputStream();
final DataOutputStream printout = new DataOutputStream(outputStream);
printout.writeBytes(param);
printout.flush();
printout.close();
 
 
InputStream inputStream = connection.getInputStream();
in = new BufferedReader(new InputStreamReader(inputStream));
String lines;
sbinner = new StringBuffer();
while ((lines = in.readLine()) != null) {
sbinner.append(lines);
}


if (log.isDebugEnabled()) {
    log.debug("Finished sending message to" + url);
}
} catch (Exception e) {
log.warn("Error Sending message to url endpoint [" + url + "].  Error is [" + e.getMessage() + "]");
}finally {
            if (in != null) {
                try {
                    in.close();
                } catch (final IOException e) {
                    // can't do anything
                }
            }
            if (connection != null) {
                connection.disconnect();
            }
        }
        log.info(sbinner.toString());
  return sbinner.toString();
}

2011-04-14 09:06:00 tang_fu 阅读数 1962
  • C++中搭建Lua脚本系统开发框架,并实现OpenGL调用

    1.如何编译lua 2.C++ 中调用lua函数 3.lua中如何调用C++函数 4.深入的介绍lua栈(lua的灵魂) 5.lua闭包和上值的使用 6.lua元表的使用(lua的精髓) 7.实现导出C++类给lua 8.实现自动化导出类给lua 9.导出OpenGL函数库给lua 10.游戏循环中调用lua,实现OpenGL绘制.

    3987 人正在学习 去看看 张立铜
某个功能被编译到so文件中,那么如何通过php来调用它?一个方法是写一个php模块(php extension),在php中调用该模块内的函数,再通过该模块来调用so中的函数。下面做一个简单的例子,使用的操作系统是Fedora Core 6。

某个功能被编译到so文件中,那么如何通过php来调用它?一个方法是写一个php模块(php extension),在php中调用该模块内的函数,再通过该模块来调用so中的函数。下面做一个简单的例子,使用的操作系统是Fedora Core 6。

首先做一个简单的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
$ gcc -shared -o libhello.so hello.o
$ su
# echo /usr/local/lib > /etc/ld.so.conf.d/local.conf
# cp libhello.so /usr/local/lib
# /sbin/ldconfig

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

/**
* 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
3 + 4 = 7

OK,下面我们来制作PHP模块。首先确保你安装了 php-devel 包,没有的话请自行从安装光盘上找。然后下载php源代码。我使用的是php-5.2.3.tar.gz,解压缩。

$ tar xzvf php-5.2.3.tar.gz
$ cd php-5.2.3/ext

然后通过下面的命令建立一个名为 hello 的模块。

$ ./ext_skel --extname=hello

执行该命令之后它会提示你应当用什么命令来编译模块,可惜那是将模块集成到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])

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

$ phpize 该程序在ubuntu的php5-dev包中

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

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

打开 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);
}

保存退出,编译并安装:

$ ./configure
$ make LDFLAGS=-lhello
luther@gliethttp:~/php-5.2.13/ext/hello$ sudo make install
Installing shared extensions: /usr/lib/php5/20060613+lfs/
$ su
# cp modules/hello.so /usr/lib/php/modules

luther@gliethttp:~$ sudo vim /etc/php5/apache2/php.ini
;enable_dl = Off
;允许dl()动态加载so扩展功能
enable_dl = On
luther@gliethttp:~$ sudo service apache2 reload

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

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

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

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

luther@gliethttp:~$ sudo vim /etc/php5/apache2/php.ini
enable_dl = Off
extension=hello.so
luther@gliethttp:~$ sudo service apache2 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扩展实现了

Browser网页浏览端和Server服务端apache之间没有了远端和本地之分,Browser可以直接执行
Server服务端的任何php扩展出来的so实现的函数,包括so扩展中实现的删除Server端的本地文件和打开/dev/下面的设备,
当然对php扩展so的调用都是由apache完成的,所以操作用户都是www-data,
因此不论删除apache端的文件还是打开
apache端的 /dev/设备都要使用户www-data具有相应操作权限[luther.gliethttp]
luther@gliethttp:~$ chmod a+w /var/www 允许www-data用户向/var/www目录写
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdlib.h>
int hello_add(int a, int b)
{
int fd;
char file[256];
fd = open("/dev/null", O_APPEND);
sprintf(file, "luther.gliethttp =%d==", fd);
mkdir(file, 0700);
return a + b;
}
luther@gliethttp:~$ ll /var/www/
total 20K
-rw-r--r-- 1 luther luther 447 2010-03-28 14:06 index.php
drwx------ 2 www-data www-data 4.0K 2010-03-28 14:35 luther.gliethttp =12==
drwx------ 2 www-data www-data 4.0K 2010-03-28 14:35 luther.gliethttp =13==
drwx------ 2 www-data www-data 4.0K 2010-03-28 14:35 luther.gliethttp =15==
drwx------ 2 www-data www-data 4.0K 2010-03-28 14:35 luther.gliethttp =14==
drwx------ 2 www-data www-data 4.0K 2010-03-28 14:35 luther.gliethttp =16==
2019-07-08 18:15:20 wengedexiaozao 阅读数 229
  • C++中搭建Lua脚本系统开发框架,并实现OpenGL调用

    1.如何编译lua 2.C++ 中调用lua函数 3.lua中如何调用C++函数 4.深入的介绍lua栈(lua的灵魂) 5.lua闭包和上值的使用 6.lua元表的使用(lua的精髓) 7.实现导出C++类给lua 8.实现自动化导出类给lua 9.导出OpenGL函数库给lua 10.游戏循环中调用lua,实现OpenGL绘制.

    3987 人正在学习 去看看 张立铜

PHP根据UserAgent判断客户端操作系统,浏览器信息

接口地址:http://www.useragentstring.com,直接在浏览器访问能看到本机的UserAgent信息

接口调用说明:http://www.useragentstring.com/pages/api.php

将UserAgent作为参数调用该接口,会返回操作系统信息,浏览器信息,好像只能返回PC的,我传了包含Mobile的UserAgent过去,返回的都是空,
可以将mobile单独判断,根据返回的内容,对比自己电脑的系统,浏览器,就知道每个字段什么意思了。

补充一下,又找到一个接口地址:http://9n4.cn/,这个可以判断出搜狗浏览器,最好是把每个浏览器的useragent都放一起对比一下,根据useragent里面是否包含浏览器特有的标识判断。

2019-03-30 11:37:09 qq_36025814 阅读数 117
  • C++中搭建Lua脚本系统开发框架,并实现OpenGL调用

    1.如何编译lua 2.C++ 中调用lua函数 3.lua中如何调用C++函数 4.深入的介绍lua栈(lua的灵魂) 5.lua闭包和上值的使用 6.lua元表的使用(lua的精髓) 7.实现导出C++类给lua 8.实现自动化导出类给lua 9.导出OpenGL函数库给lua 10.游戏循环中调用lua,实现OpenGL绘制.

    3987 人正在学习 去看看 张立铜

                                                                          PHP判断请求来自哪个操作系统

1、需求:用PHP写了一个接口/son/get。Android,IOS,小程序都需要调用。现在判断是否是小程序调用的接口,如果是,就做特殊处理(比如少返回一些数据)。

2、思路:刚开始我想,需要判断是不是小程序那是不是需要小程序传一个参数过来标识呢。后来发现思路错误,PHP自带的超全局变量 $_SERVER 中就能够区分来源。

3、获取操作系统版本。

function getSystem() {	// 获取操作系统版本
	$agent = $_SERVER ['HTTP_USER_AGENT'];
	$platform = '';
	$version = '';
	if (preg_match ( '/win/i', $agent )) {
		$platform = 'Win';
		if (preg_match ( '/nt 10/i', $agent )) {
			$version = '10';
		} else if (preg_match ( '/nt 6.3/i', $agent )) {
			$version = '8.1';
		} else if (preg_match ( '/nt 6.2/i', $agent )) {
			$version = '8';
		} else if (preg_match ( '/nt 6.1/i', $agent )) {
			$version = '7';
		} else if (preg_match ( '/nt 6.0/i', $agent )) {
			$version = 'Vista';
		} else if (preg_match ( '/nt 5.2/i', $agent )) {
			$version = '2003';
		} else if (preg_match ( '/nt 5.1/i', $agent )) {
			$version = 'XP';
		} else if (preg_match ( '/nt 5.0/i', $agent )) {
			$version = '2000';
		} else if (preg_match ( '/nt/i', $agent )) {
			$version = 'NT';
		} else if (preg_match ( '/32/i', $agent )) {
			$version = '32';
		} else if (strpos ( $agent, '95' )) {
			$version = '95';
		} else if (preg_match ( '/win 9x/i', $agent ) && strpos ( $agent, '4.90' )) {
			$version = 'ME';
		} else if (preg_match ( '/98/i', $agent )) {
			$version = '98';
		}
	}
    else if (preg_match ( '/MicroMessenger/i', $agent )) {
        $platform = 'Program';//小程序
    }
	else if (preg_match ( '/Android/i', $agent )) {
		$platform = 'Android';
	} else if (preg_match ( '/iPhone/i', $agent )) {
		$platform = 'iPhone';
	} else if (preg_match ( '/linux/i', $agent )) {
		$platform = 'Linux';
	} else if (preg_match ( '/unix/i', $agent )) {
		$platform = 'Unix';
	} else if (preg_match ( '/sun/i', $agent ) && preg_match ( '/os/i', $agent )) {
		$platform = 'SunOS';
	} else if (preg_match ( '/ibm/i', $agent ) && preg_match ( '/os/i', $agent )) {
		$platform = 'IBM OS/2';
	} else if (strpos ( $agent, 'Macintosh' )) {
		$platform = 'Mac';
	} else if (preg_match ( '/PowerPC/i', $agent )) {
		$platform = 'PowerPC';
	} else if (preg_match ( '/AIX/i', $agent )) {
		$platform = 'AIX';
	} else if (preg_match ( '/HPUX/i', $agent )) {
		$platform = 'HPUX';
	} else if (preg_match ( '/NetBSD/i', $agent )) {
		$platform = 'NetBSD';
	} else if (preg_match ( '/BSD/i', $agent )) {
		$platform = 'BSD';
	} else if (preg_match ( '/OSF1/i', $agent )) {
		$platform = 'OSF1';
	} else if (preg_match ( '/IRIX/i', $agent )) {
		$platform = 'IRIX';
	} else if (preg_match ( '/FreeBSD/i', $agent )) {
		$platform = 'FreeBSD';
	} else if (preg_match ( '/teleport/i', $agent )) {
		$platform = 'teleport';
	} else if (preg_match ( '/flashget/i', $agent )) {
		$platform = 'flashget';
	} else if (preg_match ( '/webzip/i', $agent )) {
		$platform = 'webzip';
	} else if (preg_match ( '/offline/i', $agent )) {
		$platform = 'offline';
	}
	$arr = array (
			'platform' => $platform,
			'version' => $version 
	);
	return $arr;
}

4、判断来源是否是小程序

情况一:只有一个接口执行【此操作】,直接在该方法中判断。

class Son extends Api{
    function get(){
	$system = getSystem();
	if($system['platform']=='Program'){	//如果来源是小程序
	    /* 处理返回给小程序的数据 */
	}
    }
}

情况二:多个接口执行【此操作】,则把判断写到他们的父类属性[ $is_less ]中。

class Api{
    protected $is_less = 0;	//是否少返回
    protected function init(){
	$system = getSystem();
	if($system['platform']=='Program'){	//如果来源是小程序
	    $this->is_less = 1;
	}
    }
}
//然后在子类中判断该属性是否为1:
class Son extends Api{
    function get(){
	if($this->is_less == 1){
	    /* 处理返回给小程序的数据 */
	}
    }
}

情况三:【此操作】是可变的操作,可能由于需求变动不执行【此操作】,需要小程序返回的数据和其他端一样。
为了避免改代码,我就在后台加一个配置:return_less 是否少返回:1是,0否。当这2个条件都满足的时候,才执行【此操作】。
如果不执行【此操作】,把配置 return_less 改为 0 即可。

class Api{
    protected $is_less = 0;	//是否少返回
    protected function init(){
	$system = getSystem();
	if($system['platform']=='Program'){	//如果来源是小程序
	    $return_less = ConfigModel::getConfig('return_less');//如果配置的是少返回数据
	    if($return_less==1){
		$this->is_less = 1;
	    }
	}
    }
}
//然后在子类中判断该属性是否为1:
class Son extends Api{
    function get(){
	if($this->is_less == 1){
	    /* 处理返回给小程序的数据 */
	}
    }
}

5、备注
【此操作】是否是小程序调用的接口,如果是,就做特殊处理(比如少返回一些数据)。

 

没有更多推荐了,返回首页