-
PHP底层原理分析和底层扩展编写
运行原理
http://www.phpchina.com/article-40203-1.html
PHP底层开发 可以理解为就是C的开发,那么简单地说如果我们要查看某个PHP函数的底层实现怎么看呢?
需要PHP源码包:http://www.php.net/downloads.php
主要目录是Zend 和ext(写扩展的目录)
举个栗子,如果需要查看curl_exec(),如何查看。
我们知道curl_exec 是CURl扩展中的函数,那么源码目录大概是src/ext/crul/
然后我们发现 interface.c 下实现了 这个PHP方法:
部分源码如下:
PHP_FUNCTION(curl_exec)
{
CURLcode
error;
zval
*zid;
php_curl
*ch;
if
(zend_parse_parameters(ZEND_NUM_ARGS(), "r", &zid) == FAILURE)
{
return;
}
if ((ch =
(php_curl*)zend_fetch_resource(Z_RES_P(zid), le_curl_name,
le_curl)) == NULL) {
RETURN_FALSE;
}
_php_curl_verify_handlers(ch, 1);
_php_curl_cleanup_handle(ch);
error =
curl_easy_perform(ch->cp);
SAVE_CURL_ERROR(ch, error);
if (error !=
CURLE_OK && error != CURLE_PARTIAL_FILE) {
smart_str_free(&ch->handlers->write->buf);
RETURN_FALSE;
}
if
(!Z_ISUNDEF(ch->handlers->std_err)) {
php_stream *stream;
stream =
(php_stream*)zend_fetch_resource2_ex(&ch->handlers->std_err,
NULL, php_file_le_stream(), php_file_le_pstream());
if (stream)
{
php_stream_flush(stream);
}
}
if
(ch->handlers->write->method == PHP_CURL_RETURN &&
ch->handlers->write->buf.s) {
smart_str_0(&ch->handlers->write->buf);
RETURN_STR_COPY(ch->handlers->write->buf.s);
}
if
(ch->handlers->write->method == PHP_CURL_FILE &&
ch->handlers->write->fp) {
fflush(ch->handlers->write->fp);
}
if
(ch->handlers->write_header->method == PHP_CURL_FILE
&& ch->handlers->write_header->fp) {
fflush(ch->handlers->write_header->fp);
}
if
(ch->handlers->write->method == PHP_CURL_RETURN) {
RETURN_EMPTY_STRING();
} else
{
RETURN_TRUE;
}
}
这就是底层源码 了,但是我疑问的是 如果开发完扩展如何加入PHP包中生效,毕竟查看PHP
Module包的时候只发现了一堆.dll文件,而且是非可读的码?呵呵,那是因为那是C被编译之后的文件。
那么来看一组干货:
windows下开发PHP扩展dll
http://www.360doc.com/content/14/0509/16/12091178_376141791.shtml
http://blog.csdn.net/evkj2013/article/details/52346792
这下就全部清晰了。
-
相关阅读:
selenium webdriver 的环境搭建时注意事项
python之文件处理
python的if语句、while循环、for循环
mysql从库Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'报错处理
openstack之keystone部署
网关协议
HTTP协议
Openstack keystone组件详解
jboss服务启动失败报:Error occurred during initialization of VM
python字典的常用操作
-
原文地址:https://www.cnblogs.com/linewman/p/9918807.html
Copyright © 2020-2023
润新知