php怎么不调用函数,不会php可以学thinkphp吗?
可以,但是非常不建议。因为这会让你的基础不牢固,你可能会用thinkphp快速模仿出一个网站,但是一些php的原理都会被你忽略掉。
php是一门web开发语言,而thinkphp是在这上面封装的框架。简单来说,thinkphp就是把常用的功能给你封装好,你可以自己调用,但是其实它的底层调用的还是php的函数和基本语法。
当然如果非常短时间就要使用thinkphp开发一些简单应用,也可以直接学习它,毕竟上手容易是php的一大特点。但是之后,你还是要去重新踏踏实实学习php基本语法,基本函数,它的常用功能,因为这些都是你深入理解框架的前提。
基本功是最简单的,但是也是最难的。我们常讲万变不离其中,这个中就是基本功。有了基本功,你可以很好地理解框架,更好地使用框架,而且你还可以自己开发框架,这些都是在你打好基础的前提下。
最后一下,不建议在不会php的前提下就直接学习thinkphp,基础永远都是最重要的,基本功是你攀登高峰的最好选择。
sql语句不起作用?
PHP7开始已经不再支持mysql_*系列函数了,建议改用mysqli或者PDO来操作数据库,写法更简单,比如mysqli一行代码就能执行SQL并返回结果集: $db = new mysqli(DB_HOST, DB_USERNAME, DB_PASSWORD, DB_NAME, DB_PORT)
; var_export($db->query("你的SELECT查询语句")->fetch_all()); PDO也类似: $db = new PDO(连接参数)
; var_export($db->query($sql)->fetchAll());
在PHP中如何正确创建函数?
tep 1 =>
php的扩展模块都放在 ext/ 目录下,比如说 snmp模块、mysql模块。 我们要建立自己的模块,就要在ext目录下为自己的模块建一个目录。比如,我们要做一个分析config文件的模块,命名为pconfig模块(parse config的简写),需在ext下建立目录pconfig。将我写好的7个文件copy到该目录下,另外需对主目录下的configure和internal_functions.c作一些修改。
Step 2 =>
Makefile.am Makefile.in
是模板文件,用户执行configure时,会调用这两个文件,生成编译时所用的Makefile文件。修改时将小写的pconfig换成你自己的模块名,别忘了把大写的PCONFIG也替换掉(不要告诉我你不会vi的替换语句)。config.m4也是执行configure将会调用的检测脚本程序,以后我们来讨论这些脚本程序的更深入的修改。现在你只需要把pconfig该成你的模块就可以了。对config.h.stub和setup.stub也如法炮制。其实setup.stub也没什么用。
Step 3 =>
php3-pconfig.h 头文件中
extern php3_module_entry pconfig_module_entry;
#define pconfig_module_ptr &pconfig_module_entry
#define phpext_pconfig_ptr pconfig_module_ptr
这几行定义了模块的入口,将入口注册到php后,php会通过模块入口找到你写的函数
下面几个函数定义是用宏进行定义的,展开以后其实就是 php3_minit_pconfig , php3_rinit_pconfig ……分别在你的模块初试化或结束时被调用,如果你的模块很简单,也就不需要这些定义了
extern PHP_MINIT_FUNCTION(pconfig);
extern PHP_RINIT_FUNCTION(pconfig);
extern PHP_MSHUTDOWN_FUNCTION(pconfig);
PHP_MINFO_FUNCTION(pconfig);
这是你的函数声明,将来写在php脚本语句中的函数名就是在PHP_FUNCTION中定义的名字。
PHP_FUNCTION(pconfig_test);
如果有多个,还可以继续往下加
PHP_FUNCTION(pconfig_parsefile);
PHP_FUNCTION(pconfig_release); …….
Step 4 =>
接下来我们看最重点的C代码了
function_entry pconfig_functions[] = {
PHP_FE(pconfig_test, NULL)
{NULL, NULL, NULL}
};
定义的是你的函数的入口(前面我们提到过模块的入口),按照格式将你在头文件中定义的函数写进去吧。注意,这是用宏定义的,不要管语法是否正确。以后我们具体讨论这些宏的用法。
php3_module_entry pconfig_module_entry = {
"pconfig", pconfig_functions, PHP_MINIT(pconfig), PHP_MSHUTDOWN(pconfig), PHP_RINIT(pconfig), NULL, PHP_MINFO(pconfig), STANDARD_MODULE_PROPERTIES
};
注册模块的入口信息,比如模块名,函数接口,初试化模块将调用的函数等等,如果你的模块不执行复杂操作的话,可以忽略掉他们,写成
php3_module_entry pconfig_module_entry = {
"pconfig", pconfig_functions, NULL,NULL,NULL,NULL,NULL,STANDARD_MODULE_PROPERTIES
};
Step 5 =>
写你自己的函数
在头文件和function_entry处,我们已经定义了自己的函数pconfig_test,现在我们就来实现pconfig_test的功能。就比如执行两个数相加的和吧。
static void _php3_pconfig_test(INTERNAL_FUNCTION_PARAMETERS)
{ ......
}
PHP_FUNCTION(pconfig_test)
{
_php3_pconfig_test(INTERNAL_FUNCTION_PARAM_PASSTHRU);
}
当系统调用pconfig_test时,会调用你的_php3_pconfig_test函数,当然你也可以把_php3_pconfig_test里的内容直接写在PHP_FUNCTION(pconfig_test)中,这样做只是程序结构比较清晰。注意:不要将_php3_pconfig_test命名成php3_pconfig_test,PHP_FUNCTION(pconfig_test)宏展开后实际上就是php3_pconfig_test!
Step 6 =>
好了,现在我们开始修改configure,在echo $ac_n "checking for MySQL support""... $ac_c" 1>&6的前面(当然,如果你熟悉configure的话,可以加在任何合适的地方)加上下面几句话
if test "${with_pconfig+set}" = set; then
withval="$with_pconfig"
# Add your lib in here
EXTRA_LIBS="$EXTRA_LIBS"
# Add your include path in here
INCLUDES="$INCLUDES"
EXT_SUBDIRS="$EXT_SUBDIRS pconfig"
EXT_LIBS="$EXT_LIBS pconfig/libphpext_pconfig.a"
EXTINFO_DEPS="$EXTINFO_DEPS ../ext/pconfig/extinfo.c.stub"
EXT_STATIC="$EXT_STATIC pconfig"
fi
修改internal_functions.c,在头文件定义中加入#include "ext/pconfig/php3_pconfig.h"
在zend_module_entry数组中加入phpext_pconfig_ptr,
Step 7 =>
从新configure,带上需要的参数,不要忘记的是在参数里加入 --with-pconfig
Step 8 =>
index.php3
<? echo pconfig_test(123,678)."
"; ?>
执行%>php index.php3
PHP用1个函数实现post请求?
引言
前天的文章,我们说到了如何高效的下载网络资源,对于小体积的文件。可以便捷的使用 file_put_contents() 进行请求。与之配对的函数 file_get_contents() 则是读取资源。
今天我们讨论一下,有没有一种可能,使用一个函数,就可以给服务器发送post请求的数据呢?
学习时间上一段中我们已经提示了,有一个函数可以用于读取网络资源,也就是间接的发起网络请求。默认 file_get_contents()是使用 GET 请求,如果是POST请求按道理也应该做的来。不过要怎么写呢?
file_get_contents() 函数是用来将文件的内容读入到一个字符串中的首选方法。如果操作系统支持还会使用内存映射技术来增强性能。
其参数形式如下:
string file_get_contents( string $filename[, bool $use_include_path = false[, resource $context[, int $offset = -1[, int $maxlen]]]] )
复杂的功能,我们需要组装后面的参数即可。我们需要使用流操作的上下文 context,传入该函数。
首先构造请求的参数,也就是键值对,这里需要使用 & 进行多参数连接:
$postdata = http_build_query( array( 'name' => 'joe', 'age' => '13' ) );
接着构造请求结构体:
$opts = array('http' => array( 'method' => 'POST', 'header' => 'Content-Type: application/x-www-form-urlencoded', 'content' => $postdata ) );
最重要的一步,创建基于流的上下文,使用
$context = stream_context_create($opts);
写到这里就“万事俱备只欠东风”了。我们隆重地清楚主旨函数处理这些参数:
$result = file_get_contents('http://example.com/submit.php', false, $context);
之后结果,或者错误内容,就会输出到 $result 对象。使用 false 判断,或者使用已知的接口返回数据类型,进一步处理。
深度定制上一节的内容并没有考虑网络超时,接口授权,等等情形。本节我们说一个复杂度高一些的,要求处理一个https请求,并配置了 basic auth 的 url,并使用 post 上传数据。
首先还是裁剪请求体:
$opts = array('http' => array( 'method' => 'POST', 'header' => "Content-Type: text/xml\r\n.Authorization: Basic ".base64_encode("$https_user:$https_password")."\r\n", 'content' => $body, 'timeout' => 60 ) );
注意我们在请求上添加了 header,这是根据目标 url 的要求添加的。$body 就是上一节中的 $postdata 结构类型。
接着创建流上下文:
$context = stream_context_create($opts);
最后调用函数:
$url = 'https://'.$https_server;
$result = file_get_contents($url, false, $context, -1, 40000);
写在最后通过上面两个细节的函数处理,大家是不是对 file_get_contents() 有了更加深入的看法,原来这家伙还可以这么用,真是开了眼界!
Happy coding :_)
我是 @程序员小助手 ,持续分享编程知识,欢迎关注。
php为什么不能常驻内存?
PHP 是解释运行的,PHP 页面被解释执行后,所有相关的资源都会被回收,对象也被销毁了,所以PHP 程序无法做到常驻内存运行。