邢栋博客
邢栋博客,Action博客,记录工作和生活中的点点滴滴
php发送与接收流文件方法
<?php /** php 发送流文件 * @param String $url 接收的路径 * @param String $file 要发送的文件 * @return boolean */ function sendStreamFile($url, $file){ if(file_exists($file)){ $opts = array( 'http' => array( 'method' => 'POST', 'header' => 'content-type:application/x-www-form-urlencoded', 'content' => file_get_contents($file) ) ); $context = stream_context_create($opts); $response = file_get_contents($url, false, $context); $ret = json_decode($response, true); return $ret['success']; }else{ return false; } } $ret = sendStreamFile('http://localhost/receiveStreamFile.php', 'send.txt'); var_dump($ret); /** php 接收流文件 * @param String $file 接收后保存的文件名 * @return boolean */ function receiveStreamFile($receiveFile){ $streamData = file_get_contents('php://input'); if($streamData!=''){ $ret = file_put_contents($receiveFile, $streamData, true); }else{ $ret = false; } return $ret; } $receiveFile = 'receive.txt'; $ret = receiveStreamFile($receiveFile); echo json_encode(array('success'=>(bool)$ret)); ?>
关于php类的析构函数
<?php class A { public $name = 'xd'; function __construct($test='test'){ echo 'construct->'.$test.'<br>'; } function __destruct(){ echo 'destruct->'.$this->name.'<br>'; } } $a = new A('a'); $a = null; $b = new A('b'); echo 'helloxd'; ?>
<!--
上面的结果是:construct->a
destruct->xd
construct->b
111destruct->xd
如果把$a = null;去掉
则
construct->a
construct->b
111 destruct->xd
destruct->xd
ps:析构函数会在程序执行完毕之后进行调用,如果把new类的变量设置为null(重新赋值一样),可以触发析构函数的调用
-->
php获取和处理url常用方法
<?php
//当前页面 http://localhost/ceshi/url.php?id=365
//获取域名或主机地址
echo $_SERVER['HTTP_HOST']; //localhost
echo "<br>";
//获取当前页面url
echo $_SERVER['PHP_SELF']; // /ceshi/url.php,如果url为url.php/index/index,则输出/ceshi/url.php/index/index
echo "<br>";
//获取当前页面参数
echo $_SERVER["QUERY_STRING"];//id=365
echo "<br>";
//获取端口
echo $_SERVER["SERVER_PORT"];//80
echo "<br>";
//完成的url
$url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER["QUERY_STRING"];
echo $url;
echo "<br>";
echo "<pre>";
print_r(pathinfo($url)); //返回文件路径的信息
/*结果 Array
(
[dirname] => http://localhost//ceshi
[basename] => url.php?id=365
[extension] => php?id=365
[filename] => url
)*/
print_r(parse_url($url)); //解析 URL,返回其组成部分
/*结果Array
(
[scheme] => http
[host] => localhost
[path] => //ceshi/url.php
[query] => id=365
)
*/
print_r(basename($url)); // 返回路径中的文件名部分 结果url.php?id=365
echo "<br>";
print_r(dirname($url)); //返回路径中的目录部分 结果 http://localhost/ceshi
//当前页面 http://localhost/ceshi/url.php?id=365
//获取域名或主机地址
echo $_SERVER['HTTP_HOST']; //localhost
echo "<br>";
//获取当前页面url
echo $_SERVER['PHP_SELF']; // /ceshi/url.php,如果url为url.php/index/index,则输出/ceshi/url.php/index/index
echo "<br>";
//获取当前页面参数
echo $_SERVER["QUERY_STRING"];//id=365
echo "<br>";
//获取端口
echo $_SERVER["SERVER_PORT"];//80
echo "<br>";
//完成的url
$url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER["QUERY_STRING"];
echo $url;
echo "<br>";
echo "<pre>";
print_r(pathinfo($url)); //返回文件路径的信息
/*结果 Array
(
[dirname] => http://localhost//ceshi
[basename] => url.php?id=365
[extension] => php?id=365
[filename] => url
)*/
print_r(parse_url($url)); //解析 URL,返回其组成部分
/*结果Array
(
[scheme] => http
[host] => localhost
[path] => //ceshi/url.php
[query] => id=365
)
*/
print_r(basename($url)); // 返回路径中的文件名部分 结果url.php?id=365
echo "<br>";
print_r(dirname($url)); //返回路径中的目录部分 结果 http://localhost/ceshi
php设计模式之策略模式简单事例
<?php //策略模式 interface OutputInterface { public function load($arrayOfData); } class SerializedArrayOutput implements OutputInterface { public function load($arrayOfData) { return serialize($arrayOfData); } } class JsonStringOutput implements OutputInterface { public function load($arrayOfData) { return json_encode($arrayOfData); } } class ArrayOutput implements OutputInterface { public function load($arrayOfData) { return $arrayOfData; } } class SomeClient { private $output; public function setOutput(OutputInterface $outputType) { $this->output = $outputType; } public function loadOutput($arrayOfData) { return $this->output->load($arrayOfData); } } $client = new SomeClient(); $arrayOfData = array('name'=>'action','age'=>'28'); // Want an array? $client->setOutput(new ArrayOutput()); $data = $client->loadOutput($arrayOfData); var_dump($data); echo "<hr>"; // Want some JSON? $client->setOutput(new JsonStringOutput()); $data = $client->loadOutput($arrayOfData); var_dump($data); echo "<hr>"; // Want some Serialized? $client->setOutput(new SerializedArrayOutput()); $data = $client->loadOutput($arrayOfData); var_dump($data);
php设计模式之单例模式简单事例
<?php //单例模式 class Singleton { /** * @var 这个类的"单例" */ private static $instance; /** * 防止在这个类之外new这个类 */ private function __construct() { } /** * @return 返回这个类的单例 */ public static function getInstance() { if(self::$instance === null){ self::$instance == new self(); } return self::$instance; } /** * @return void 把 clone 方法声明为 private,防止克隆单例 */ private function __clone() { } /** * @return void 把反序列化方法声明为 private,防止反序列化单例 */ private function __wakeup() { } } class SingletonChild extends Singleton { } $obj = Singleton::getInstance(); var_dump($obj === Singleton::getInstance()); // bool(true) $anotherObj = SingletonChild::getInstance(); var_dump($anotherObj === Singleton::getInstance()); // bool(true) var_dump($anotherObj === SingletonChild::getInstance()); // bool(true) ?>
单例模式是非常有用的,特别是我们需要确保在整个请求的声明周期内只有一个实例存在。 典型的应用场景是,当我们有一个全局的对象(比如配置类)或一个共享的资源(比如事件队列)时。
php设计模式之工厂模式简单事例
<?php //工厂模式 class Automobile { private $vehicleMake; private $vehicleModle; public function __construct($make,$model) { $this->vehicleMake = $make; $this->vehicleModle = $model; } public function getMakeAndModel() { return $this->vehicleMake.' '.$this->vehicleModle; } } class AutomobileFactory { public static function create($make,$model) { return new Automobile($make,$model); } } $veyron = AutomobileFactory::create('Bugatti','Veyron'); print_r($veyron->getMakeAndModel()); ?>
上面的代码用来一个工厂来创建 Automobile 对象。用这种方式创建对象有两个好处: 首先,如果你后续需要更改,重命名或替换 Automobile 类,你只需要更改工厂类中的代码,而不是在每一个用到 Automobile 类的地方修改; 其次,如果创建对象的过程很复杂,你也只需要在工厂类中写,而不是在每个创建实例的地方重复地写。
php关于猴子选大王的算法题
<?php /** * $m 猴子总数 * $n 出局数 */ function king($m,$n){ $arr = range(1, $m); $i = 0; while (count($arr)>1) { if(($i+1)%$n == 0){ unset($arr[$i]); }else{ array_push($arr, $arr[$i]); unset($arr[$i]); } $i++; } return reset($arr); } function king2($m,$n){ $arr = range(1, $m); $unsetNum = 0; for($i=2;$i<= $m*$n;$i++){ foreach ($arr as $key => $value) { $unsetNum++; if($unsetNum == $n){ unset($arr[$key]); $unsetNum = 0; } if(count($arr) == 1){ return reset($arr); } } } } function ysf($m,$n){ $num=0; for($i=2; $i<=$m; $i++){ $num=($num+$n)%$i; } return $num+1; } $res = king(5,3); var_dump($res); $res2 = king2(5,3); var_dump($res2); $res3 = ysf(5,3); var_dump($res3);
php还原java中gzip压缩方法
有个需求,要把java代码里面的jzip压缩方法还原成php
java jzip压缩代码如下
php代码
同学给推荐了这边文章,如下内容
0 - FAT filesystem (MS-DOS, OS/2, NT/Win32)
1 - Amiga
2 - VMS (or OpenVMS)
3 - Unix
4 - VM/CMS
5 - Atari TOS
6 - HPFS filesystem (OS/2, NT)
7 - Macintosh
8 - Z-System
9 - CP/M
10 - TOPS-20
11 - NTFS filesystem (NT)
12 - QDOS
13 - Acorn RISCOS
255 - unknown
我压缩后转换成byte数组,第九位是11,java那边是0,可能我的文件系统是NTFS filesystem (NT),java可能是FAT filesystem (MS-DOS, OS/2, NT/Win32)
java jzip压缩代码如下
/*** * 压缩GZip * * @param data * @return */ public static byte[] gZip(byte[] data) { byte[] b = null; try { ByteArrayOutputStream bos = new ByteArrayOutputStream(); GZIPOutputStream gzip = new GZIPOutputStream(bos); gzip.write(data); gzip.finish(); gzip.close(); b = bos.toByteArray(); bos.close(); } catch (Exception ex) { ex.printStackTrace(); } return b; }
php代码
class { /* * 把字符串进行gzip压缩,并转换成byte数组 * @param $str 需要进行压缩的字符串 * @param $bytes 目标byte数组 */ public static function myGzencode($str){ $res = gzencode($str); $res = self::getBytes($res); $res[9] = 0; //这步完全是为了和java压缩后的头部保持一致,也许是个坑 return $res; } /* * 转换一个String字符串为byte数组 * @param $str 需要转换的字符串 * @param $bytes 目标byte数组 * @author Zikie */ public static function getBytes($str) { $len = strlen($str); $bytes = array(); for($i=0;$i<$len;$i++) { if(ord($str[$i]) >= 128){ $byte = ord($str[$i]) - 256; }else{ $byte = ord($str[$i]); } $bytes[] = $byte ; } return $bytes; } }ps:https://tools.ietf.org/html/rfc1952#section-2.2
同学给推荐了这边文章,如下内容
0 - FAT filesystem (MS-DOS, OS/2, NT/Win32)
1 - Amiga
2 - VMS (or OpenVMS)
3 - Unix
4 - VM/CMS
5 - Atari TOS
6 - HPFS filesystem (OS/2, NT)
7 - Macintosh
8 - Z-System
9 - CP/M
10 - TOPS-20
11 - NTFS filesystem (NT)
12 - QDOS
13 - Acorn RISCOS
255 - unknown
我压缩后转换成byte数组,第九位是11,java那边是0,可能我的文件系统是NTFS filesystem (NT),java可能是FAT filesystem (MS-DOS, OS/2, NT/Win32)