邢栋博客

邢栋博客,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

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压缩代码如下


 /*** 
     * 压缩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)



最新微语