山河博客

PHP实现ping api

大家好我是山河,今天给大家分享点技术,很多小伙伴问我怎么写php的ping api,我跟他们说用exec或者systerm函数来实现,但是他们说主机商不允许使用这两个函数,让我想想办法。

既然不能直接使用dos命令来搞ping,那我们只能模拟ping了。

话不多说,上效果图

嘿嘿,这样效果也差不多。

我们运用php的fsockopen函数来模拟 HTTP连接 实现ping的效果,但实际与ping差距是很大的,因为ping是ICMP协议,而我们是使用tcp或者udp协议。

话不多说,上代码,本代码的模拟ping是使用tcp协议 (HTTP/1.1 和 HTTP/2 都是基于 TCP 传输协议),

HTTP/3 是基于 UDP 传输协议

<?php
/*
    此模拟ping仅仅只是 使用 HTTP协议 模拟ping。不是真正的ping,与真正的 ping 误差很大。
*/
    // ping次数
    $num = 5;
    // 执行时间
    function times(){
        list($usec,$sec) = explode(" ",microtime());
        return ((float)$usec + (float)$sec); 
    }
    function demo($host,$port=80,$i) {
        if($i == 0) {
            echo 'Ping 域名 '.$host.'IP: ['.gethostbyname($host).'] 端口:'.$port.'<br />';
        } 
            echo ping($host,$port);
    }
    function ping($host,$port=80) {
        $starttime= times();
        $ip = gethostbyname($host);
        $fp = @fsockopen($host,$port);
        if(!$fp) {
            return 'ping超时!';
        } else {
            $get = "GET / HTTP/1.1\r\nHost:".$host."\r\nConnect:".$port."Close\r\n";
            fputs($fp,$get);
            fclose($fp);
            $nowtime = times();
            $time = $nowtime - $starttime;
            $time = ceil($time * 1000);
            return 'Ping from '.$ip.':'.$port.' time = '.$time.'ms<br />';
        }
    }
    for($i = 0;$i < $num;$i++){
        echo demo('blog.shanhe.info',80,$i);
        //每次运行中间间隔1S
        sleep(1);
        //刷新输出缓存
        ob_flush();
        flush();
    }

好了,我是山河,本文到此结束

山河博客

PHP基础教程(经典基础练习题)

大家好,我是山河,以前说好的要发一些教程,也没发(没时间+懒)
这次我给大家带来的是PHP的基础题
题目是 :
1. 年份是4的倍数而不是100的倍数;同时满足要用到 &&
2. 年份是400的倍数。其他的年份都不是闰年。

对于学过一阵子PHP的人来说难度不是很大,对于刚学PHP的人来说,难度略大

好吧,实话说确实很简单

这道题呢,要用到几个PHP自带的函数,也可以自定义函数,不过能省事就省事
上函数代码

empty()
//此函数用于检测变量是否为null(空值)
floor()
//floor()函数用于小数取整
is_numeric()
//用于检测变量是否为数字或数字字符串
/*
    为什么会用到这些呢?我上我写的代码你就懂了(实际上懒得解释)
    empty()函数是因为我在PHP文件中写HTML代码,直接在页面获取数据并输出,如果不用empty()函数
    页面会报错,报错原因是PHP代码是从上到下运行的(这里我也不懂怎么解释,大概是这个意思)
    这时候你获取表单的变量是获取到了NULL的,所以运行后会显示没有获取到XX变量的数据,会报错
*/

直接上全部代码,走起

if(floor($x)!=$x) //floor()函数用于小数取整
    {
        echo "请输入正整数字";
    }
    elseif($x>0)
    {
    if($x%4==0 && $x%100!=0 || $x%400==0)//这玩意我就不说了,你们自己理解,很基础的运算符
    {
    echo $x."是闰年";
    } else
    {
    echo $x."是平年";
    }
   }
   else
   {
    echo "请输入大于1的正整数";
   }
}
else
{
    echo '请输入正整数字';
}
}
?>
<form method="post" action="">
输入年份<input type="text" name="year">
<br>
<input type="submit"  value="判断闰年">
</form>
</body>
</html>

© 版权来自山河
纯原创 代码纯手打,教程纯手打

文章之前首发于 lolichan.vip 论坛 。

山河博客

PHP策略模式详解-PHP设计模式

山河博客
山河博客

大家好我是山河,今天跟大家来谈谈PHP设计模式中的PHP策略模式

策略模式特点:传递不同的参数调用不同的策略(方法)

话不多说了,直接上代码加深印象

<?php
class Walk {
	public function way() {
		echo '走着去<br>';
	}
}
class Bus {
	public function way() {
		echo '坐车去<br>';
	}
}
//策略模式
class Student {
	public function play($obj) {
		$obj->way();
	}
}
//测试
$stu=new Student;
$stu->play(new Walk());	//走着去
$stu->play(new Bus());	//坐车去

大家看完这段代码应该都明白了吧。

好了,文章结束,我是山河

山河博客

PHP工厂模式详解-PHP设计模式

山河博客
山河博客

大家好我是山河,今天我给大家谈一谈关于PHP的设计模式之工厂模式哈

工厂模式特点:传递不同的参数获取不同的对象

上代码加深理解

<?php
class ProductsA {
}
class ProductsB {	
}
//工厂模式
class ProductsFactory {
	public function create($num) {
		switch($num) {
			case 1:
				return new ProductsA;
			case 2:
				return new ProductsB;
			default:
				return null;
		}
	}
}
//测试
$factory=new ProductsFactory();
$obj1=$factory->create(1);
$obj2=$factory->create(2);
var_dump($obj1,$obj2); //object(ProductsA)#2 (0) { } object(ProductsB)#3 (0) { } 

通过上方代码可以看出来,将ProductsFactory对象实例化了之后,调用create方法,传递1就实例化ProductsA对象,传递2就实例化ProductsB对象。

这个就是PHP工厂模式。

好了,本文结束,我是山河。

山河博客

PHP单例模式详解-PHP设计模式

山河博客
山河博客

大家好我是山河,今天我给大家谈谈关于这个PHP的单例模式啊,

什么是单例模式?

单例模式要求:一个类只能有一个对象

应用场景:多次请求数据库只需要一个连接对象。

实现:三私一公

1、私有的静态属性用来保存对象的单例
2、私有的构造方法用来阻止在类的外部实例化
3、私有的__clone阻止在类的外部clone对象
4、公有的静态方法用来获取对象的单例

代码详解

<?php
//三私一公
class DB {
	//静态的属性用来保存对象的单例
	private static $instance;
	//私有的构造方法阻止在类的外部实例化
	private function __construct() {
		
	}
	//私有的__clone()阻止在类的外部clone对象
	private function __clone() {
		
	}
	public static function getInstance() {
		//保存的值不属于DB类的类型就实例化
		if(!self::$instance instanceof self)
			self::$instance=new self();
		return self::$instance;
	}
}
//测试
$db1=DB::getInstance();
$db2=DB::getInstance();
var_dump($db1,$db2);	//object(DB)#1 (0) { } object(DB)#1 (0) { } 

各位小伙伴,看完这篇教程,我相信大家是不是有所感悟呢?

好了,本篇文章到此结束,我是山河。

PHP die(),exit()的用法

山河博客
山河博客

大家好我是山河,今天我给大家分享关于PHP的教程哈,好久没更新编程教程了。

今天主题是PHP die()函数,PHP exit()函数的用法和区别。

话不多说,开始讲解,

<?php
die("输出完毕,结束");

die() 函数输出一条消息,并退出当前脚本

PHP版本要求 php 4+

而exit() 函数也是输出一条消息,并退出当前脚本

PHP版本也要求 php 4+

这两个是没什么区别的,exit()函数是die()函数的别名。

exit(不用加括号)可以用于循环中,可以结束循环。

好了,本文就讲到这里。

PHP

PHP面向对象的几个小知识点

大家好我是山河,今天给大家来讲解一个关于PHP面向对象的小知识点,这几个小知识点可以说是必知必会的,话不多说,直接上代码边讲

$this调用对象的
self::调用类自己的
parent::调用父类的
static::调用子对象实例的

这是我们今天要讲的内容,然后直接上实例代码,讲的更清楚。

首先是this,在对象中的每个成员方法里面都会存在一个特殊的对象引用“$this”。成员方法属于哪个对象,“$this”就代表哪个对象

$this -> 成员属性;
$this -> 成员方法(参数);

之后是self,self用来调用类的东西:类常量、静态属性、静态方法;

self::静态属性,静态方法

$this和self区别:$this只能用在成员方法中,而self可用在成员方法和静态方法

再之后是parent::

parent:: 可用于调用父类中定义的成员方法。

最后是static::

static::延迟绑定,可以调用子类实例

好了,本篇文章到此结束,我是山河。

PHP

本站采用创作共用版权 CC BY-NC-SA 3.0 CN 许可协议,转载或复制请注明出处

PHP8x手册

大家好我是山河,有小伙伴需要PHP8x系列的手册,但是又访问不了PHP官网,针对这个问题,山河帮大家下载好了,自取即可。

下图是截的预览图

PHP手册预览图

PHP学习之安装PHP环境xampp

大家好我是山河,今天我给大家写一篇PHP安装环境的教程

很多小白在初学的时候啊,都不懂怎么配置环境,今天山河就来给大家带上如何安装配置PHP环境的教程,并附上资源包

本教程是手把手指导,配图,傻瓜式教程,包会!

为什么要选择XAMPP呢?因为xampp集成环境是带上了PHP+MYSQL和ftp等东西,装备齐全,而且面板简洁易懂,适合初学小白。

xampp安装在底部

好了,开始教程:

演示系统是win10,win7/8也大同小异

下载好本网站提供的xampp安装包之后,打开会是这样

 

然后解压缩,就变成这样

接下来点击xampp安装包,出现

点击yes,接下来

一直点next

根据需求选择你要的东西,当然默认是全选的,咱们先不管,继续next

安装目录选择,可以更改,然后继续next

继续next

意思是现在将要安装xampp到你的电脑上,点next就行了

然后就开始安装

等进度条结束即可

最后点击finish(结束)即可

之后打开你安装的目录,我安装在C盘

点击xampp的文件夹

找到xampp-control 带橙色图标的应用程序

点击

选哪国语言都可以,我选的是美国,英语

之后就会弹出

点击Apache和Mysql的start即可

好了,教程结束

还有什么问题可以发邮件给山河,山河一一解答。

另外求赞助,广告等

本文为山河博客,山河技术分享原创文章,转载请标注原创以及本文地址!

谢谢各位浏览本网站。