phpphp

PHP在Linux下执行定时任务的实现思路详解

PHP本身是没有定时功能的,PHP也不能多线程。

PHP的定时任务功能必须通过和其他工具结合才能实现,例如WordPress内置了wp-cron的功能,很厉害。

一、Linux服务器上使用CronTab定时执行php

我们先从相对比较复杂的服务器执行php谈起。

服务器上安装了php,就可以执行php文件,无论是否安装了nginx或Apache这样的服务器环境软件。

而Linux中,使用命令行,用CronTab来定时任务,又是绝佳的选择,而且也是效率最高的选择。

首先,进入命令行模式。

作为服务器的linux一般都默认进入命令行模式的,当然,我们管理服务器也一般通过putty等工具远程连接到服务器,为了方便,我们用root用户登录。

在命令行中键入:

crontab -e

之后就会打开一个文件,并且是非编辑状态,则是vi的编辑界面,通过敲键盘上的i,进入编辑模式,就可以编辑内容。

这个文件中的每一行就是一个定时任务,我们新建一行,就是新建一条定时任务(当然是指这一行内按照一定的格式进行书写)。

我们现在来举个例子,增加一行,内容如下:

00 * * * * lynx -dump https://www.codezhijia.com/script.php

这是什么意思呢?实际上上面这一行由两部分组成,前面一部分是时间,后面一部分是操作内容。

例如上面这个:

00 * * * *就是指当当前时间的分钟数为00时,执行该定时任务。时间部分由5个时间参数组成,分别是:

分时日月周第1列表示分钟1~59 每分钟用或者 */1表示,/n表示每n分钟,例如*/8就是每8分钟的意思,下面也是类推第2列表示小时1~23(0表示0点)第3列表示日期1~31第4列表示月份1~12第5列标识号星期0~6(0表示星期天)

整个句子的后面部分就是操作的具体内容。

lynx -dump https://www.codezhijia.com/script.php

意思就是说通过lynx访问这个url。我们在使用中主要用到lynx、curl、wget来实现对url的远程访问,而如果要提高效率,直接用php去执行本地php文件是最佳选择。

例如:

00 */2 * * * /usr/local/bin/php /home/www/script.php

这条语句就可以在每2小时的0分钟,通过linux内部php环境执行script.php,注意,这里可不是通过url访问,通过服务器环境来执行哦,而是直接执行,因为绕过了服务器环境,所以效率当然要高很多。

好了,已经添加了几条需要的定时任务了吧。点击键盘上的Esc键,输入“:wq”回车,这样就保存了设置的定时任务,屏幕上也能看到提示创建了新的定时任务。接下来就是好好写你的script.php了。

关于CronTab的更多用法这里就不介绍了,如果你想更灵活的使用这个定时任务功能,应该自己再去深入学习一下crontab。

二、Windows服务器上使用bat定时执行php

windows上和linux上有一个类似的cmd和bat文件,bat文件类似于shell文件,执行这个bat文件,就相当于依次执行里面的命令(当然,还可以通过逻辑来实现编程),所以,我们可以利用bat命令文件在windows服务器上面实现PHP定时任务。

实际上在windows上定时任务,和linux上道理是一样的,只不过方法和途径不同。好了下面开始。

首先,在一个你觉得比较适当的位置创建一个cron.bat文件,然后用文本编辑器打开它(记事本都可以),在里面写上这样的内容:

D:phpphp.exe -q D:websitetest.php这句话的意思就是,使用php.exe去执行test.php这个php文件,和上面的contab一样,绕过了服务器环境,执行效率也比较高。

写好之后,点击保存,关闭编辑器。

接下来就是设置定时任务来运行cron.bat。

依次打开:“开始–>控制面板–>任务计划–>添加任务计划”,在打开的界面中设置定时任务的时间、密码,通过选择,把cron.bat挂载进去。

确定,这样一个定时任务就建立好了,在这个定时任务上右键,运行,这个定时任务就开始执行了,到点时,就会运行cron.bat处理,cron.bat再去执行php。

三、非自有服务器(虚拟主机)上实现php定时任务

如果站长没有自己的服务器,而是租用虚拟主机,就无法进入服务器系统进行上述操作。

这个时候应该如何进行php定时任务呢?其实方法又有多个。

1、使用ignore_user_abort(true)和sleep死循环

在一个php文档的开头直接来一句:

ignore_user_abort(true);

这时,通过url访问这个php的时候,即使用户把浏览器关掉(断开连接),php也会在服务器上继续执行。

利用这个特性,我们可以实现非常牛的功能,也就是通过它来实现定时任务的激活,激活之后就随便它自己怎么办了,实际上就有点类似于后台任务。

而sleep(n)则是指当程序执行到这里时,暂时不往下执行,而是休息n秒钟。

如果你访问这个php,就会发现页面起码要加载n秒钟。实际上,这种长时间等待的行为是比较消耗资源的,不能大量使用。

那么定时任务到底怎么实现呢?使用下面的代码即可实现:

<?phpignore_user_abort(true); set_time_limit(0); date_default_timezone_set('PRC'); // 切换到中国的时间$run_time = strtotime('+1 day'); // 定时任务第一次执行的时间是明天的这个时候$interval = 3600*12; // 每12个小时执行一次if(!file_exists(dirname(__FILE__).'/cron-run')) exit(); // 在目录下存放一个cron-run文件,如果这个文件不存在,说明已经在执行过程中了,该任务就不能再激活,执行第二次,否则这个文件被多次访问的话,服务器就要崩溃掉了do { if(!file_exists(dirname(__FILE__).'/cron-switch')) break; // 如果不存在cron-switch这个文件,就停止执行,这是一个开关的作用$gmt_time = microtime(true); // 当前的运行时间,精确到0.0001秒$loop = isset($loop) && $loop ? $loop : $run_time - $gmt_time; // 这里处理是为了确定还要等多久才开始第一次执行任务,$loop就是要等多久才执行的时间间隔$loop = $loop > 0 ? $loop : 0; if(!$loop) break; // 如果循环的间隔为零,则停止sleep($loop); // ...// 执行某些代码// ... @unlink(dirname(__FILE__).'/cron-run'); // 这里就是通过删除cron-run来告诉程序,这个定时任务已经在执行过程中,不能再执行一个新的同样的任务$loop = $interval; } while(true);

通过执行上面这段php代码,即可实现定时任务,直到你删除cron-switch文件,这个任务才会停止。

但是有一个问题,也就是如果用户直接访问这个php,实际上没有任何作用,页面也会停在这个地方,一直处于加载状态,有没有一种办法可以消除这种影响呢?fsockopen帮我们解决了这个问题。

fsockopen可以实现在请求访问某个文件时,不必获得返回结果就继续往下执行程序,这是和curl通常用法不一样的地方,我们在使用curl访问网页时,一定要等curl加载完网页后,才会执行curl后面的代码,虽然实际上curl也可以实现“非阻塞式”的请求,但是比fsockopen复杂的多,所以我们优先选择fsockopen,fsockopen可以在规定的时间内,比如1秒钟以内,完成对访问路径发出请求,完成之后就不管这个路径是否返回内容了,它的任务就到这里结束,可以继续往下执行程序了。

利用这个特性,我们在正常的程序流中加入fsockopen,对上面我们创建的这个定时任务php的地址发出请求,即可让定时任务在后台执行。

如果上面这个php的url地址是www.codezhijia.com/script.php,那么我们在编程中,可以这样:

// ...// 正常的php执行程序// ..// 远程请求(不获取内容)函数,下面可以反复使用function _sock($url) { $host = parse_url($url,PHP_URL_HOST); $port = parse_url($url,PHP_URL_PORT); $port = $port ? $port : 80; $scheme = parse_url($url,PHP_URL_SCHEME); $path = parse_url($url,PHP_URL_PATH); $query = parse_url($url,PHP_URL_QUERY); if($query) $path .= '?'.$query; if($scheme == 'https') { $host = 'ssl://'.$host; } $fp = fsockopen($host,$port,$error_code,$error_msg,1); if(!$fp) { returnarray('error_code' => $error_code,'error_msg' => $error_msg); } else { stream_set_blocking($fp,true);//开启了手册上说的非阻塞模式 stream_set_timeout($fp,1);//设置超时$header = "GET $path HTTP/1.1rn"; $header.="Host: $hostrn"; $header.="Connection: closernrn";//长连接关闭 fwrite($fp, $header); usleep(1000); // 这一句也是关键,如果没有这延时,可能在nginx服务器上就无法执行成功 fclose($fp); returnarray('error_code' => 0); } } _sock('www.codezhijia.com/script.php'); // ...// 继续执行其他动作// ..

把这段代码加入到某个定时任务提交结果程序中,在设置好时间后,提交,然后执行上面这个代码,就可以激活该定时任务,而且对于提交的这个用户而言,没有任何页面上的堵塞感。

2、借用用户的访问行为来执行某些延迟任务

但是上面使用sleep来实现定时任务,是效率很低的一种方案。

我们希望不要使用这种方式来执行,这样的话就可以解决效率问题。

我们借用用户访问行为来执行任务。用户对网站的访问其实是一个非常丰富的行为资源,包括搜索引擎蜘蛛对网站的访问,都可以算作这个类型。

在用户访问网站时,内部加一个动作,去检查任务列表中是否存在没有被执行的任务,如果存在,就将这个任务执行。

对于用户而言,利用上面所说的fsockopen,根本感觉不到自己的访问竟然还做出了这样的贡献。

但是这种访问的缺点就是访问很不规律,比如你希望在凌晨2点执行某项任务,但是这个时间段非常倒霉,没有用户或任何行为到达你的网站,直到早上6点才有一个新访问。

这就导致你原本打算2点执行的任务,到6点才被执行。

这里涉及到一个定时任务列表,也就是说你需要有一个列表来记录所有任务的时间、执行什么内容。

一般来说,很多系统会采用数据库来记录这些任务列表,比如wordpress就是这样做的。

我则利用文件读写特性,提供了托管在github上的开源项目php-cron,你可以去看看。

总之,如果你想要管理多个定时任务,靠上面的单个php是无法合理布局的,必须想办法构建一个schedules列表。

由于这里面的逻辑比较复杂,就不再详细阐述,我们仅停留在思路层面上。

3、借用第三方定时任务跳板

很好玩的是,一些服务商提供了各种类型的定时任务,例如阿里云的ACE提供了单独的定时任务,你可以填写自己应用下的某个uri。

百度云BCE提供了服务器监测功能,每天会按照一定的时间规律访问应用下的固定uri。

类似的第三方平台上还有很多定时任务可以用。你完全可以用这些第三方定时任务作为跳板,为你的网站定时任务服务。

比如说,你可以在阿里云ACE上建立一个每天凌晨2点的定时任务,执行的uri是/cron.php。

然后你创建一个cron.php,里面则采用fsockopen去访问你真正要执行某些任务的网站的url,例如上面的www.codezhijia.com/script.php,而且在cron.php中还可以访问多个url。

然后把cron.php上传到你的ACE上面去,让ACE的定时任务去访问/cron.php,然后让cron.php去远程请求目标网站的定时任务脚本。

4、循环利用include包含文件(待验证)

php面向过程的特性使得其程序是从上往下执行的,利用这个特性,在我们使用include某个文件时,就会执行被引入的文件,知道include的文件内程序执行完之后,再往下执行。如果我们创建一个循环,再利用sleep,不断的include某个文件,使循环执行某段程序,则可以达到定时执行的目的。

我们再进一步,并不是利用while(true)来实现循环,而是利用被include文件本身再include自身来实现循环,比如我们创建一个do.php,它的内容如下:

if(...) exit(); // 通过某个开关来关闭执行// ... // 执行某些程序// ...sleep($loop); // 这个$loop在include('do.php');之前赋值include(dirname(__FILE__).'/do.php');

其实通过这种方法执行和while的思路也像。而且同样用到sleep,效率低。

PHP定时任务是一个非常有意思的东西,虽然说实话,用系统的php.exe去直接执行php文件的效率更高,但是对于很多普通站长而言,虚拟主机是无法做到直接php执行原生程序的。

本文仅提供一些解决的思路,我也仅仅是在学习中,有很多问题或表述都不正确,希望你指出来;你可以通过本文的思路,开发出自己的一种解决方案。

感兴趣的小伙伴请关注我,一起努力,一起学习!

展开
收起

关于PHP语言和PHP商城系统介绍

电子商务行业的快速发展,让很多企业都看到电商给企业带来的巨大利益,越来越多的企业选择搭建自己的商城系统。但是很多企业对于商城系统开发了解可能并不多,因为目前很多商城系统采用的开发语言是PHP,所以今天千讯小编就来介绍下PHP语言和PHP商城系统。

PHP语言

PHP语言的定义 php中文名叫超文本预处理器,是一种通用的开源脚本语言,它的语法混合了C、Java、Perl的特点,容易学习,被广泛用于Web开发领域。与其它的编程语言相比,PHP能够更快的执行动态网页,具有非常强大的功能,能够实现所有的CGI功能,并且支持几乎所有流行的数据库及操作系统。另外PHP语言还具有免费性、快捷性、强跨平台性、高效率、专业性等优势。正是拥有如此多的好处与优势,不管是商城系统开发公司还是商家都喜欢采用PHP语言开发的商城系统。 php商城系统 Php商城系统是基于php开发架构,具有高度灵活性和低难度开发的特点,是一款功能优秀的网上商城系统,并且PHP商城系统可以开发多套免费的模板,拥有强大的后台管理功能以及专业的商城系统解决方案,能够快速的帮商家解决商城系统搭建问题。 另外,PHP商城系统还拥有完善的功能模块,包括商品管理功能、会员管理功能、订单管理功能、商品促销功能、管理员模块、订单管理模块等,这些完善的功能强大的模块能够满足大多商家对商城系统的需求,同时对于有特殊需求的商家来说,进行二次开发也是相对容易的。 PHP商城系统是目前市场颇受欢迎的电商系统,与Java版本的商城系统以及其他语言开发的商城系统相比,更具优势,所以商家或者企业在选择商城系统开发的时候,千讯小编建议还是尽量选择PHP语言开发的商城系统,当然也有的企业因为特殊原因而会选择Java等其他语言的系统。

内容来源:http://www.henanqianxun.com

展开
收起

php学习之php的预定义变量的使用

说明:就是php系统内置的提供给使用的变量,这个变量一般都是超全局变量,超全局就是没有作用域的限制有的还可以跨页面

$GLOBALS_SERVER_GET_POST_FILES_COOKIE_SESSION_REQUEST_ENV

1.$GLOBALS

说明:globals是php内置的可以自动获取当前页面中的所有变量的内容,包括局部变量、全局变量、静态变量

2.$_SERVER

说明:server会自动获取服务器和客户端的信息

$_SERVER是一个包含了诸多如头信息(header)、路径(path)、以及脚本位置(scriptlocations)等信息的数组。这个数组中的项目由web服务器创建,不能保证每个服务器都提供全部项目,服务器可能会忽略一些或者提供一些没有在这里列出来的项目,这也就意味着大量的此类变量都会在CGI 1.1规范中说明,

$HTTP_SERVER_VARS包含着相同的信息,但它不是一个超全局变量(注意 $HTTP_SERVER_ARS与$_SERVER是不同变量,php处理他们的方式也不同)

3.$_FILES

说明:获取上传文件的信息

name:图片名称type:图片类型tmp_name:文件的临时文件夹和文件名称error:错误信息size:文件大小

将上传的文件移动到新的位置:move_uploaded_file

bool move_uploaded_file(string $filename , string $destination)

filename:上传的文件的文件名destination:移动文件到这个位置

本函数检查并确保由filename指定的文件是合法的上传文件(即通过php的http post上传机制所上传的)如果文件合法,则将其移动有destination指定的文件

返回值

成功时返回true

如果filename不是合法的上传文件。不会出现任何操作,move_uploaded_file()将返回false

如果filename是合法的上传文件。但出于某些原因无法移动,不会出现任何操作,move_updloaded_file()将返回false,此外还会发出一条警告

4.$_GET:url方式传递数据

说明:其实就是浏览器地址传递方式

传递方式:URL地址?参数值1=值1&参数值2=值2….

传递形式:表单的get方式和超链接方式

5.$_POST:http post方式传递数据

说明:通过http协议的post方式来传递数据

传递方式:表单的post方式或者ajax

6.$_REQUEST:http request变量

说明:默认情况下包含了$_GET和$_POST和$_COOKIED的数组

<?php/*** @Author: admin* @Date: 2018-08-12 18:05:09* @Last Modified by: admin* @Last Modified time: 2018-08-12 22:36:52*///预定义变量$name='张三';$age=23;$sex='男';static $wx='吾爱乐享';//var_dump($GLOBALS);//打印所有的变量,包括自定义的和系统自带的//定义一个函数function user(){global $add;$add='陕西';var_dump($GLOBALS);echo $GLOBALS['name'];//在局部打印全局变量}user();echo $add;//全局打印局部变量echo $GLOBALS['wx'];//打印静态变量的值//接收file传来的信息// $file_name=$_FILES['filename'];// var_dump($file_name);move_uploaded_file($file_name['tmp_name'], 'F:\wamp\www\php2\images/1.jpg');//get接收$get_user=$_REQUEST['getuser'];echo $get_user;?><!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title></head><body><!--创建一个表格,把服务器信息保存到表格中--><table border="1"><tr><th>服务器名称</th><th>服务器对应值</th></tr><?php foreach ($_SERVER as $key => $value): ?><tr><td><?php echo $key ?></td><td><?php echo $value ?></td> </tr> <?php endforeach ?></table><!-- 创建表单,上传文件 --><!-- <form action="" method='post' enctype="multipart/form-data"><input type="file" name='filename'><input type="submit" value="上传"></form> --><!-- post传递方式 --><form action="" method="post"><input type="text" name="getuser"><input type="submit" value="提交"></form></body></html>

展开
收起

php学习之php的运算符的使用

表达式:表达式是php最重要的基石,在php 中。几乎所写的任何东西都是一个表达式,简单但却最精确的定义一个表达式的方式就是任何有值的东西。如$a=1;

运算符分类

运算符优先级算术运算符赋值运算符位运算符比较运算符错误控制运算符执行运算符递增递减运算符逻辑运算符字符串运算符数组运算符类型运算符

1算术运算符

算术运算符包括:加(+)、减(-)、乘(*)、除(/)、求余(求模)(%)

<?php//加法运算符$a =1;$b =2;echo "a与b的和为:";echo $a + $b ;//减法运算符echo "<br>a与b的差为: ";echo $a - $b;//乘法运算符echo "<br>a与b的积为: ";echo $a * $b ;//除法运算符echo "<br>a与b的商为: ";echo $a / $b;//求余数echo "<br>a与b求余为: ";echo $a % $b ;?>

注意:

1.当运行算术运算符时,字符串类型的会自动转换为0进行和数字运算,比如:$a=1 $b=’b’,那么在运行算术运算符时,$b的值自动转换为0,$a+$b=1+0=1

案例:

2.赋值运算符:

赋值运算符:= 就是把某个值赋给某个变量

语法:$a=1;

赋值一般说的是把等号后面的值赋值给前面的变量,可以多次赋值,$a=$b=1;

3.比较运算符

==:等于,比较的是值,只要值相等结果就是等于===:全等,比较的时类型和值,只有两个都相等才相等!=:不等于:类型转换后两个值不相等,返回为true!==:不全等:两个值不相等或他们的类型不同>:大于,<:小于>=:大于等于<=:小于等于

<?php//比较运算符$a=1;$b=1;$c='1';if($a===$b){echo "全等";}elseif($a==$b){echo "相等";}else{echo "不相等";}echo "<br>";if($a===$c){echo "全等";}elseif($a==$c){echo "相等";}else{echo "不相等";?>

4.错误抑制符:@

说明:屏蔽一些不重要的错误,不影响当前页面的脚本运行

<?php$con =@mysql_connect('localhost','root','');if($con){echo '连接成功';}?>

5.字符串运算符:.或者.=

说明:字符串连接符(拼接),把两个或多个字符串进行连接

<?php$str1='公众号';$str2='吾爱乐享';$str3=$str1.$str2;echo $str3;?>

7逻辑运算符:== —

说明:当前的操作数会自动加1或者减1

如果一个操作数,不给赋值,++$a和$a++是一样的。

前加:++$a;先加1在赋值。后加:$a++;先赋值在加1.

<?php$a=1;$b=1;$b++;++$a;echo $a,$b;//结果为2.自身变量操作++$a和$a++结果是一样的$c=++$a;echo $c,$a;//结果a=3.c=3两个变量操作,++$a和$a++结果不一样$d=$b++;echo $d,$b;//结果b=2,d=3?>

//利用自增,实现循环遍历for($n=0;$n<=10;$n++){echo '<br>a'; echo $n;}echo '</br>-----------------';//利用自增,实现外部变量循环遍历$z='a';for($i=0;$i<=10;$i++){$z++;echo $z;}

未经允许不得转载

展开
收起

php学习之php的预定义常量的使用

说明:常量一旦定义,里面的值和常量是不能改变和销毁的,而且常量名不能重复

1.常量的定义:

语法:define(常量名,常量值);不能定义复合数据

5.xphp版本:const来定义复合的数据,如数组7.0 php版本:define可以定义复合的数据.如:define(ARR,[1,2,3,4,5]);

2访问常量

说明:直接使用常量名就可以了.。如:echo NAME;

常量的使用:网站的配置文件中使用。如:当前网站路径

3.魔术常量—预定义常量

__LINE__:文件中的当前行号__FILE__:文件的完整路径和文件名,如果用在被包含的文件中,则返回被办好的文件名,自php4.0.2起,__FILE__总是包含一个绝对路径.如果是符号连接,则是解析后的绝对路径,而在此前的版本有时会包含一个相对路径__DIR__:文件所在目录。如果用在被包括文件中,则返回被包括的文件所在目录,它等价于dimame(__FILE__)除非是i根目录。赋值目录中名不包括末尾斜杠__FUNCTION__:函数名称,php4.3.0新增,php5起本常量返回该函数被定义时的名字(区分大小写)在php4中该值总是小写__CLASS__:类的名称__TRAIT__:trait的名称__METHOD__:类的方法名__NAMESPACE__:当前命名空间的名称mvc:URL传递数据:index.php:c=getuser&a=xxxx&m=index

产生随机数的函数:rand()

说明:rand:产生一个随机整数

intrand(void)

int rand(int $min, int $max)

<?php/*** @Author: admin* @Date: 2018-08-12 22:56:43* @Last Modified by: admin* @Last Modified time: 2018-08-12 23:39:54*///常量的定义define('NAME','张三');define('PI',3.14);echo NAME,PI;const USER='admin';echo USER;//__CLASS__:获取当前类名class getuser{function index(){include './xx/index.html';}function add(){include './xxx/index.html';}}//rand()随机函数$num=rand(1,100);//随机生成1-100的整数echo $num;

题:

变量处理常用的函数有哪些? 举例说出至少四个,并各举一个案例说明unset如何在函数内部就销毁一个全局变量,请使用的代码来说明如何销毁PHP基本数据类型的值传递和引用传递的区别是什么,请画出对应的内存示意图一个页面server.php,并输出至少5个$_SERVER内的元素信息,并说明是什么含义,页面表现形式如下:元素名称 使用形式 结果 含义

PHP_SELF $_SERVER[‘PHP_SELF’] /test/$_SERVER.php 表示本网页路径

参考:PHP手册〉语言参考〉预定义变量〉$_SERVER

5.写一个表单,用来填写“用户信息”,要求出现所有的表单元素类型(除文件类型):

文本框,密码框,单选,复选,下拉,多行文本域,隐藏域

提交后显示用户所填写的所有数据。复选框的问题:都一个name值,复选框name是一个,问:怎么实现获取多个选项的值

答案:

1.变量常用的函数:

isset():案例:$user=isset($_GET[‘user’])?$_GET[‘user’]:”;//判断是否存在

unset():案例:$a=1; unset($a);//销毁变量a

empty():案例:$a=1;if(empty($a)){echo “存在”};//判断是否为空

echo:案例:$a=1;echo $a;//打印a

var_dump():案例:$a=1; var_dump($a);//打印a

2.用unset销毁在函数中的全局变量

//只销毁局部变量$a=1;function demo(){global $a;//把全局变量局部声明echo $a;unset($a);//销毁变量aecho $a;}demo();//变量a被销毁echo $a;//a的值存在正常打印//销毁全局变量function un(){global $a;//声明局部变量 unset($GLOBALS['a']); //echo $a;}un();echo $a;//a的值没有了

3.值传递和引用传递的区别

值传递,传递过去的是数值,

引用传递,传递的是地址值

4.新建一个server.php

<?php/*** @Author: admin* @Date: 2018-08-13 00:03:26* @Last Modified by: admin* @Last Modified time: 2018-08-13 01:13:03*/$arrayName = array('REQUEST_URI','SCRIPT_NAME','PHP_SELF','SERVER_ADMIN','SCRIPT_FILENAME');$arr2=array('URI 用来指定要访问的页面','包含当前脚本的路径','当前执行脚本的文件名',' Apache 服务器配置','当前执行脚本的绝对路径');echo "<table border=1>";echo '<tr>';echo '<th>元素名称</th><th>使用形式</th><th>结果</th><th>含义</th>';echo '</tr>';foreach ($arrayName as $key => $value) {echo '<tr>';echo '<td>'.$value.'</td>';echo "<td>\$_SERVER['$value']</td>";echo "<td>".$_SERVER[$value]."</td>";echo '<td>'.$arr2[$key].'</td>';echo '</tr>';}echo '</table>';

5.答案

展开
收起

php学习之php的八种数据类型的使用

字符串类型:string

php学习之php的八种数据类型之字符串string的使用

1.整数型:int

说明:是负数、0、正数的集合、在php中存储整数为10进制、八进制、十六进制

语法:$var=整数数字;

八进制的写法:在数字前面加上0,就是八进制。数字的范围有0-7。算法:出去开头0,各位+十位*8 +百为*8*8+千位*8*8*8….$num=0456; //4*8*8+5*8+6=302十六进制的写法:在数字前面加上0x,数字为0-f算法:出去开头0,各位+十位*16 +百为*16*16+千位*16*16*16….$num =0x456;//4*16*16+5*16+6=1110 十进制的写法:直接写数字,数字范围0-9

php最大的存储数值为:21亿。用常量PHP_INIT_MAX查询,最大存储值为2147483647,超过这个值自动转为float型

php最大的位数为14位,一个数值占多个位置,PHP_INT_SIZE

2.浮点型:float

说明:就是小数,浮点型也叫浮点数、float、双精度数double或实数real

php中的小说有两种表现形式,

普通的小数科学计数法

浮点数的精度有限,尽管取决于系统,php通常使用ieee754双精度格式,则由于取整而导致的最大相对误差为1.11e-16。非基本数学运算可能会给出更大的误差,并且要考虑到进行复合运算时的误差传递

此外,以十进制能够精确表示的有理数如0.1或0.7,无论有多少为数都不能被内部所使用的二进制精确表示,因此不能在不丢失一点点精度的情况下转换为二进制的格式,这就会造成混乱的结果,如:floor((0.1+0.7)*10)通常会返回7而不是预期中的8,因为结果内部的表示其实是类似于7.9999999999999991118…

所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等,如果确实需要更高的精度,应该使用任意精度数学函数或者gmp函数

普通小数形式

小数末尾多个,小数点后面超过最大长度,会自动删除超出部分,最末尾会四舍五入

科学计数形式

超过14位自动转为科学计数法

3.布尔类型:boolean

说明:在php中布尔型的数据只有两个值,true和false

布尔值一般都用于返回的结果用于流程控制语句中

4.数组:array

说明:一组数据的集合

$变量=array(元素1,元素2,元素3,……);

5.对象:object

说明:世间万物皆为对象

在php中的对象是由类创建来的

//class创建一个类,调用对象$name=null;$age=0;Class people{//属性var $name;var $age;//方法function run(){echo '跑步';}}//创建对象$zs=new people();$zs->name='张三';$zs->age=23;echo $zs->name;$zs->run();$ls= new people();

6.空:null

说明特殊的null值表示一个变量没有值,null类型唯一的值就是它本身null

在php中只能有定义变量并赋值的情况,没有只定义不赋值,这个时候就需要创建一个变量,不知道存储说明值,这个时候可以使用null来创建变量

用法:

7资源:resource

说明:就是引用php外部的内容,这个时候的类型就是资源,资源是通过专门的函数建立和使用的

8.手册中的类型:用于说明需要某种类型的数据

mixed:一个参数可以接收多种不同的类型,如果函数需要的形参是两种以上,都会使用mixednumber:可以是int和floatvoid:作为返回类型意味着函数的返回值是无用的,void作为参数列表意味着函数不接受任何参数

9数据类型的转换

说明:在php 中数据类型是可以进行互相转换的,如整型1转换成字符串’1′

在php中分两种转换形式,:自动转换和强制转换

自动转换

给到特定写法就会改变原来的类型

强制转换

可以使用一些特殊的方式来强制型的改变类型

允许的强制转换的有:

(int),(integer):转换为整型(bool),(boolean):转化为布尔类型(float),(double),(real):转换为浮点型(string):转换为字符串(array):转换为数组(object):转换为对象(unset):转换为null

<?php/*** @Author: admin* @Date: 2018-08-16 22:38:26* @Last Modified by: admin* @Last Modified time: 2018-08-17 04:29:11*/////定义一个十进制的整数的类型$num1 = 10;$num2 = 0;$num3 = -10;echo $num1."<br>".$num2."<br>".$num3;echo "<br>";//定义一个八进制的类型$num1 = 000;//0$num2 = 077774;//32764$num3 = 05555;//2925echo $num1."<br>".$num2."<br>".$num3;echo "<br>";//定义一个十六进制的类型$num1 = 0x00ff;//255$num2 = 0xfff;//4095$num3 = 0x00000;//0echo $num1."<br>".$num2."<br>".$num3;echo "<br>";//查询最大php存储数值echo PHP_INT_MAX;//最大存储值为2147483647,超过这个值自动转为float型//查询一个数字占多大位置$num = 1111111111111111;//超过14位后自动转为科学计数法var_dump($num);echo PHP_INT_SIZE;//4$num = 11111111111;//超过int的取值范围后自动转为float型var_dump($num);$num = 1111111111;//没超过int的取值范围是int型var_dump($num);//小数浮点型$num1=1.1;$num2=0.0;//小数末尾多个,小数点后面超过最大长度,会自动删除超出部分,最末尾会四舍五入$num3=1.00000000000000000000000000;var_dump($num3);$num3=9.99999999999999999999999999;var_dump($num3);$num3=5.55555555555555555555555555;var_dump($num3);$num3=4.44444444444444444444444444;var_dump($num3);//科学计数$num=1111111111111111.1;//超过14位自动转为科学计数法var_dump($num);$num=1111111111111.1;//没超过14位var_dump($num);//不精准体现$num=floor((0.1+0.7)*10);//floor强制转化成浮点型var_dump($num);//结果为7二不是8//bool类型$true=true;var_dump($true);//一般布尔类型会用在控制语句中if ($num==1) {echo '真';} else {echo '假';}echo "<hr>";//class创建一个类,调用对象$name=null;$age=0;Class people{//属性var $name;var $age;//方法function run(){echo '跑步';}}//创建对象$zs=new people();$zs->name='张三';$zs->age=23;echo $zs->name;$zs->run();//null类型$a=null;$b='';//空字符串if (empty($b)) {echo '空';} else {echo $b;}//给函数的形参加默认值function FunctionName($value='',$b=null){}FunctionName();//资源resource 连接数据库$link= @mysql_connect('127.0.0.1','root','root');var_dump($link);//自动转换$a=1;$b=2;$v=$a.$b;//转换为字符串var_dump($v);if ($a) {//自动转换为boolean类型echo '真';}//强制转换$num=1;var_dump((string)$num);//强制转换为字符串$str='123';var_dump((int)$str);//强制转换为整数

展开
收起

PHP丨PHP基础知识之PHP基础入门——函数「理论篇」

前两天讲过PHP基础知识的判断条件和流程控制,今天来讲讲PHP基础知识之PHP基础入门--函数!

一、函数的声明与使用

1、函数名是标识符之一,只能有数字字母下划线,开头不能是数字。

函数名的命名,须符合"小驼峰法则":myNameIsXiaoxi my_name_is_xiaoxi

函数名不区分大小写。func() Func() FUNC() 都可以

函数名不能与已有的函数名重复,不能与系统函数名重复。

2、function_exists("func1");用于检测函数是否已声明;

注意:传入的函数名,必须是字符串格式:返回结果为true/false。

二、PHP中变量的作用域

1、局部变量:声明在函数内部的变量,称为局部变量。只在函数内部能用,函数外加需使用,需在函数中使用return关键字返回。

2、全局变量:声明的函数外部的变量,称为全局变量。

3、函数中,使用变量,默认使用内部局部变量。如果,需在函数中使用全局变量,需要使用global关键字,将全局变量引用函数,才能使用。

函数中的变量名,如果与全局变量重复,global语句之上,为函数局部变量;global语句之下,为系统全局变量。

4、 $GLOBALS[]全局数组:

$GLOBALS[]数组,是PHP给我们内置的全局数组,可以直接给数组添加值,无论在函数内外声明,均可在任何地方直接使用。

$GLOBALS["a"] = 10; ---> echo $GLOBALS["a"];//任何位置直接使用

5、函数中使用全局变量,还有一种方式:通过给函数传参,可以在函数内部使用全局变量;

但是,传递以后的参数是函数的局部变量,内部改变,外部不会变。

除非,传递的参数是地址function func($a1,&$a2){} //函数内部修改a1,则全局a1不会变,函数内部修改a2,则全局a2会变。

如果函数的形参,出现了取址符号,则,调用函数时,实参必须是变量,而不能是字面量。

6、使用require与include包含不会影响作用域。

三、静态变量

1、静态变量,使用static关键字声明。static $num = 10;

2、静态变量的特点:

>>>静态变量在函数第一次加载的时候进行声明。

>>>函数使用完不会立即释放静态变量,静态变量在整个脚本执行过程中,只会声明一次。

>>>同一函数,多次调用,共享同一个静态变量。

四、函数的参数传递

1、在PHP中,涉及参数传递时:实参列表只能比形参多,

2、常规参数传递:function func($a){} func($a);

3、引用参数传递:function func(&$a){} func($a);

①通过&引用参数传递,函数内修改变量,函数外同步变化

②形参为引用参数,实参只能是变量,不能是字面量 func(10); ×

4、默认参数:function func($b,$a=10){} func(20);

//是$可以不传,默认为10;$b必须传递,否则使用时未定义报错。

如果参数中既有默认参数,也有非默认参数,那么默认参数列表

必须要在非默认参数列表后面,即调用的时候必须保证非默认列表的优先赋值。

5、可变参数列表:由于PHP实参可以比形参多,那么我们可以传递N个实参,并通过PHP内置函数取到对应参数。

var_dump(func_get_args());//取所有参数列表(数组)

var_dump(func_num_args());//返回参数的总个数相当于count(func_get_args());

var_dump(func_get_arg(0));//根据下标,返回每个参数

五、变量函数

1、将一个函数名,转为字符串后,赋给一个变量。这个变量,就是我们所说的变量函数,可以加()调用函数内容。

function func(){}--->$fun = "func";--->$func();

六、回调函数

1、使用变量函数,自定义回调函数

function func($func){$func();}--->function f(){}--->func("f");

2、使用call_user_func_array和call_user_func自定义回调函数;

两个函数的第一个参数,均为回调函数,表示执行当前回调。

不同点在于:call_user_func_array()第二个参数为数组,并将数组的每一个值赋给回调函数的参数列表,相当于JS中的apply();

而call_user_func,是将回调函数的参数列表,直接展开写到第2~多个参数中,相当于JS中的call();

eg:call_user_func_array("func",array(1,2,3));

--> func(1,2,3);

call_user_func("func",1,2,3); --> func(1,2,3);

七、匿名函数

由于变量函数,在调用时存在多种调用方(func()/$func();)

所以为了让函数的调用更为同一,才产生了匿名函数!!!

声明匿名函数,函数体后面的分号必不可少!

匿名函数本身也是变量,用var_dump();检测为Object类型

八、PHP闭包

在PHP中,子函数无法直接访问父函数的局部变量,必须使用User关键词向下传递!!!

文章收集与网络,辛苦收集转载请备注出处一只大脸猫博客!

PHP丨PHP基础知识之流程控制WHILE循环「理论篇」

PHP丨PHP基础知识之条件语IF判断「理论篇」

PHP丨PHP基础知识之条件语SWITCH判断「理论篇」

展开
收起

PHPDoc/PHPDocumentor生成API文档

PHPDocumentor是一个用PHP写的强大的文档自动生成工具,对于有规范注释的php程序,能够快速生成具有结构清晰、相互参照、索引等功能的API文档。旧版本是PHPDoc,PHPDoc是PEAR下面的一个非常优秀的模块,类似于javadoc。从1.3.0开始,更名为phpDocumentor,新版本新加了对php5语法的支持,同时,可以通过在客户端浏览器上操作生成文档,文档可以转换为PDF、HTML、CHM等格式的文档,这样非常有利于代码的升级、维护、移交等。

前提:安装的前提是已经安装了php环境,我安装的是xampp集成开发环境。

1.PHPDoc的结构及功能

PHPDoc是全部采用OOP的思想来编写的,这也是PEAR所推荐的方式,PHPDoc的工作原理:PHPDoc扫描指定目录下面的php源代码,扫描其中的关键字,截取需要分析的注释,然后分析注释中的专用的tag,生成xml文件,接着根据已经分析完的类和模块的信息,建立相应的索引,生成xml文件对于生成的xml文件,使用定制的模板输出为html文件。从设计上来说,PHPDoc使用了2个超类:PhpdocObject和PhpdocError。这是整个PHPDoc的基本类,这种方式也是PEAR所推荐的。当你编写应用框架时,最好能够有一个基本的超类,而其他的子类或者是功能类都有一个共同的祖先。在扫描源代码过程中,PHPDoc使用的是类似GREP的形式。PHPDoc令人满意的另一方面是其分析结果是以XML形式保存的,这就意味着其他应用程序可以共享这个数据,同时PHPDoc也提供了相应的接口,你可以实现这个接口,把API文档生成其他的形式,比如PDF,LATEX,WORD等。目前,PHPDoc的分析结果可以以HTML形式表现,由于使用了模板机制,可以很方便地定制风格。

2.安装PHPDoc

安装方式有两种,一是下载源码安装,另一种是通过pear安装。

第一种方法:

第一步:安装pear

使用dos窗口进入php安装目录,有个文件叫go-pear.bat,如果没有,建议到网上下载go-pear.phar,然后在dos窗口下运行 go-pear.phar, 从而安装pear。

php go-pear.phar

第二步:安装phpdoc

Pear install phpDocumentor

在phpDocumentor成功安装后,php安装目录下会多出来一个phpdoc.bat。这个文件就是我们用来生成文档的批处理文件。

在phpdoc.bat所在目录下,输入

Phpdoc –h

会得到一个phpDocumentor的详细参数列表。先看看最重要的几个吧。

-d

这个目录代表着需要生成文档的原始php文件目录(注意是目录)

-t

这个目录代表着生成的文档存放目录

-o

这个参数代表着生成的文档格式,例如html格式,参数就是

HTML:frames:phpedit

第三步:生成文档

生成文档的命令就是:

phpdoc -d "D:\phpdoc\1" -t "D:\phpdoc\1" -o "HTML:frames:phpedit"

可以看到,解析完成后,在目标目录下生成很多html文件,打开index.html文件,就是我们需要的文档,如上图所示。

第二种方法:

第一步:下载PHPDoc压缩文件(phpdoc.zip),地址如下:

http://star7th-wordpress.stor.sinaapp.com/uploads/2013/04/phpdoc.zip

第二步:解压到某一个目录

打开phpdoc.bat,编辑第16行:

SET phpCli=D:\xampp\php\php.exe

配置phpCli 为自己php.exe文件的路径即可。

第二步:dos窗口,进入文件的解压目录,然后执行解析文档命令即可。

phpdoc -d "D:\phpdoc\1" -t "D:\phpdoc\1" -o "HTML:frames:phpedit"

以上是安装phpDocumentor1版本,目前已经更新到phpDocumentor2版本了,version2的安装也很简单。

第一步:安装pear(同上)

此处给出下载地址:http://pear.php.net/go-pear.phar

将 go-pear.phar 放到 PHP 目录下执行安装命令:

php go-pear.phar

下面会执行输入 system

然后一路回车安装完毕。

第二步:接下来安装类关系绘图用到的工具

pear install image_graphviz

下载 http://www.graphviz.org/Download_windows.php graphviz-2.38.msi

安装后,注意环境变量 path 添加上该 bin 的路径,重启电脑,否则无法生效

第三步:安装 phpDocumentor

pear channel-discover pear.phpdoc.org

pear install phpdoc/phpDocumentor

稍等一会,安装步骤完成!

注意:两个软件安装后的目录都在PHP 下的 pear 下面:

php/pear/PhpDocumentor

php/pear/Image

显然:version2 比version1速度快了很多。

展开
收起

为什么大家总喜欢黑PHP?PHP到底做错了什么

  所谓一粉顶十黑,“PHP是最好的语言”的梗即由此而来,其实它并不是讽刺PHP语言本身,而是在讽刺并不深入理解PHP的开发者。

  

  PHP有很多奇怪的设计,令大部分人必须有个参考手册握在手边才敢写代码,但它仍然能够吸引众多开发者。最重要的原因是:它拥有门槛低和用户群体大的优势。

  

  但是用户群大了,各种水平的人都会有。

  入门虽然很容易,但精通PHP是很难的,毕竟这个语言及其标准库里有太多未定义行为。

  用户群中存在不少并不够精通PHP的群体,有些人没有真正尝试过其它语言,没经历过这些语言和解释器设计不佳的部分;也有些人由于长期使用PHP,对它产生了异常深厚的情感。

  于是产生了一种现象:有些人认为PHP就是最简单最完善最好的语言,并且热衷于在各种论坛等地方与其他人进行争辩。

  

  

  后来PHP语言招黑,乃至“PHP是最好的语言”成为一个讽刺PHP开发者的梗,

  实际上还是由于2010年后移动app开发的火爆,移动开发和Web开发者地位的此消彼长而导致。

展开
收起

快速搭建Apache+php部署环境,绝无废话

快速开始,绝无废话

我的linux服务器系统是CentOS 6.5

1,安装apache:

yum install httpd

apache的文件目录 /var/www/html

apache启动,停止,查看状态的命令:

service httpd startservice httpd stopservice httpd status

配置文件 /etc/httpd/conf/httpd.conf

修改端口(默认是80) Listen 8082

修改ServerName ServerName localhost:8082

测试,能出来页面OK了

2,安装php

yum install phpphp-devel

安装好后,php -v 查看一下

能出来版本说明ok

再重启一下apache

service httpd restart

写个php页面测试

在apache的文件目录 /var/www/html下,创建一个test.php

<?php echo "Hello world!"; ?><?php phpinfo(); ?>

保存后,回到浏览器测试

完成,

3,连接mysql

mysql的安装,略。公司有DBA,呵呵。

先安装php的扩展

yum install php-mysql php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc

安装完扩展之后需要再次重启apache

service httpd restart

测试mysql是否链接成功的php代码

<?php$servername = "localhost"; $username = "username";$password = "password"; $dbname = "数据库名"; $port = "端口"; // 创建连接$conn = new mysqli($servername, $username, $password, $dbname, $port); // 检测连接if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } echo "连接成功";?>

完成。开始撸代码。

P.S:

吐槽一下,百家号这个编辑器,贴个代码是真费劲啊

展开
收起