当PHP在运行fastcgi模式的时候,php-fpm提供了一个函数,叫做fastcgi_finish_request的函数,来加快处理请求,如果有些后端请求可以先生成页面再处理的话,可以选择这个函数。

听起来挺迷茫的,下面给大家举个例子

<?phpecho 'This is example1';fastcgi_finish_request();echo 'This is example2';file_put_contents('/var/log/test.log', 'hello world');?>

当通过浏览器访问的时候,页面会输出This is example1,但是没有输出This is example2同时,也把内容写入到了日志文件中。这说明,当PHP执行到了fastcgi_finish_request的时候,服务器就和客户端结束了请求,但是服务器还是继续“异步”执行。

再来个直观的例子

<?phpecho 'This is example1';fastcgi_finish_request();echo 'This is example2';file_put_contents('/var/log/test.log', time('Y-m-d H:i:s', time()), FILE_APPEND);sleep(1);file_put_contents('/var/log/test.log', time('Y-m-d H:i:s', time()), FILE_APPEND);sleep(1);file_put_contents('/var/log/test.log', time('Y-m-d H:i:s', time()), FILE_APPEND);?>

执行的结果就是页面值输出了This is example1,服务器记录了三条日志信息。

个人觉得这个函数...

查看全文

RSA生成工具

现在越来越多的人注重安全问题,尤其是在支付过程中,不管是卖家还是买家都希望交易过程中不出现任何差错,顺利进行,没有损失。所以在各大支付接口都在支付过程中加入了签名sign验证。

签名的作用

签名有个最基本的作用就是安全...

查看全文

1、直接创建字符串

header("content-type:application/xml;");$xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?><people><name>Tyler Teng</name><sex>man</sex></people>";echo $xml;

2、使用DOMDocument进行创建

header("content-type:application/xml;");$xml = new DOMDocument('1.0', 'utf-8');$root = $xml->createElement('people');$name = $xml->createElement('name', 'Tyler Teng');$sex = $xml->createElement('sex', 'man');$root->appendChild($name);$root->appendChild($sex);$xml->appendChild($root);echo $xml->saveXML();

3、使用XMLWriter进行创建

header('Content-type:application/xml');$xml_writer = new XMLWriter;$xml_writer->openMemory();$xml_writer->startDocument('1.0', 'utf-8');$xml_writer->startElement('people');$xml_writer->writeElement('name', 'Tyler Teng');$xml_writer->writeElement('sex', 'man');$xml_writer->endElement();$xml_writer->endDocument();echo $xml_writer->outputMemory();
查看全文

PHP中调用函数都比较简单,今天要实现如下效果的代码

<?phpclass demo {public function get_site_name($prefix){return $prefix . "肥龙的博客\n";}}function get_site_url($prefix){return $prefix . "www.feilong.tech\n";}function call_function($obj, $fun, $param){if ($obj == null){$result = $fun($param);}else{$result = $obj->$fun($param);}return $result;}$demo = new demo();echo call_function($demo, "get_site_name", "site name:");echo call_function(null, "get_site_url", "site url:");?>
我们将要实现call_function的方法的功能

代码实现

PHP_FUNCTION(call_function){zval            *obj = NULL;zval             *fun = NULL;zval             *param = NULL;zval             retval;zval             args[1];#ifndef FAST_ZPP/* Get function parameters and do error-checking. */if (zend_parse_parameters(ZEND_NUM_ARGS(), "zzz", &obj, &fun, &param) == FAILURE) {return;}#elseZEND_PARSE_PARAMETERS_START(3, 3)Z_PARAM_ZVAL(obj)Z_PARAM_ZVAL(fun)Z_PARAM_ZVAL(param)ZEND_PARSE_PARAMETERS_END();#endifargs[0] = *param;if (obj == NULL || Z_TYPE_P(obj) == IS_NULL) {call_user_function_ex(EG(function_table), NULL, fun, &retval, 1, args, 0, NULL);} else {call_user_function_ex(EG(function_table), obj, fun, &retval, 1, args, 0, NULL);}RETURN_ZVAL(&retval, 0, 1);}

代码解读

zend_parse_parameters在PHP7中提供了两种获取参数的方法。zend_parse_parametersFAST ZPP方式.在PHP7之前一直使用zend_parse_parameters函数获取参数。这个函数的作用,就是把传入的参数转换为PHP内核中相应的类型,方便在PHP扩展中使用。zend_parse_parameters(ZEND_NUM_ARGS(), type_spec, &param1, &param2)ZEND_NUM_ARGS()代表参数的个数,type_spec代表参数的类型:具体的类型如下
参数对应数据类型
之后的参数是可选。可以传,也可以不传
Boolea
lon
doubl
String 字符串
Resource 资源...
查看全文