邢栋博客

邢栋博客,Action博客,记录工作和生活中的点点滴滴

php生成随机验证码
<?php
    function getVerifyCode($num){
        $content = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $content = str_shuffle($content);
        return substr($content,-$num);
    }

    echo getVerifyCode(4);
python的beautifulsoup4简单测试
# -*- coding:utf8 -*-

# 测试基于 python2.7
# 安装pip 如果没有安装的话
# sudo easy_install pip
# 安装 beautifulsoup4
# pip install beautifulsoup4

from bs4 import BeautifulSoup
import re

html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>

<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>

<p class="story">...</p>
"""

soup = BeautifulSoup(html_doc,'html.parser',from_encoding='utf-8')

print '获取所有的链接'
links = soup.find_all('a')
for link in links:
    print link.name,link['href'],link.get_text()

print '获取Lacie的链接'
link_node = soup.find('a',href='http://example.com/lacie')
print link_node.name,link_node['href'],link_node.get_text()

print '正则匹配'
link_node = soup.find('a',href=re.compile(r"ill"))
print link_node.name,link_node['href'],link_node.get_text()

print '获取p段落文字'
p_node = soup.find('p',class_="title")
print p_node.name,p_node.get_text()

php运行机制和原理

php由内核Zend引擎和扩展成组成,php内核负责处理请求、完成文件流错误处理等操作,Zend引擎可以将php程序文件转换成可以在虚拟机上运行的机器语言,扩展层提供一些应用层操作需要的函数类库等,比如数组和mysql数据库的操作等。

Zend引擎是用C语言实现的,将php代码通过词法语法解析成可执行的Opcode并实现相应的处理方法和基本的数据结构进行内存分配和管理等,对外提供相应的可供调用的API方法。Zend引擎是php的核心,所有的外围功能都是围绕他实现的。扩展层通过组件的方式提供各种基础服务、内置函数,标准库都是通过它来实现的。用户也可以编写自己的扩展来实现特定的需求。服务端应用编写接口(Server Application Programming Interface,SAPI),通过一系列钩子函数使得php可以和外围交互数据。我们平时编写的php程序就是通过不同的SAPI方式得到不同的应用模式,如通过WebServer实现的Web应用和在命令行下运行的脚本等。

一段php程序被执行的时候会被解析成opcode命令,然后在虚拟机中按照顺序执行,由于php本身是C语言开发的,所以在执行的时候调用的都是C的函数。Opcode是php程序执行的基本单位。


某公司给的测试题目201708018

演员的技能用字母A-Z表示,某活动需要演员按顺序完成任务,完成得最多的,可获得奖励。由于演员多才多艺,提前告知任务顺序,很容易完成任务。现在让演员随意表演,最后公布活动任务最长匹配度。如一个演员表演顺序 ABCBDAB,最后活动顺序为BDCABA,那么最大匹配度值为4(匹配值为BCBA或者BDAB)。现在编写程序实现以上功能:

<?php
	
	$a = 'ABCBDAB';
	$b = 'BDCABA';

	$aStrlen = strlen($a);
	$bStrlen = strlen($b);

	$maxCount = 0;

	for ($i=0; $i < $aStrlen; $i++) { 
		$ch = $a[$i];
		$aIdx = $i;
		$bIdx = 0;
		$count = 0;
		$next = false;
		for ($j=$bIdx;$j<$bStrlen; $j++) {
			if($ch == $b[$j]){
				$count++;
				$bIdx = $j;
				$next = true;
			}
			if($j == $bStrlen-1 && $count != 0 && $aIdx < $aStrlen){
				$j = $bIdx;
				$next = true;
			}
			if($next){
				if(++$aIdx == $aStrlen){
					break;
				}
				$next = false;
				$ch = $a[$aIdx];
			}
		}
		if($count > $maxCount){
			$maxCount = $count;

		}

		//假如最大次数大于剩余要比较的字符串,则break
		if($maxCount >= $aStrlen-$i){
			break;
		}
	}


	echo $maxCount;

php利用二叉堆算法来实现 TopK

利用二叉堆算法来实现 TopK
实现流程是:
1、先读取10个或100个数到数组里面,这就是我们的topK数.
2、调用生成小顶堆函数,把这个数组生成一个小顶堆结构,这个时候堆顶一定是最小的.
3、从文件或者数组依次遍历剩余的所有数.
4、每遍历出来一个则跟堆顶的元素进行大小比较,如果小于堆顶元素则抛弃,如果大于堆顶元素则替换之.
5、跟堆顶元素替换完毕之后,在调用生成小顶堆函数继续生成小顶堆,因为需要再找出来一个最小的.
6、重复以上4~5步骤,这样当全部遍历完毕之后,我们这个小顶堆里面的就是最大的topK,因为我们的小顶堆永远都是排除最小的留下最大的,而且这个调整小顶堆速度也很快,只是相对调整下,只要保证根节点小于左右节点就可以.
7、算法复杂度的话按top10最坏的情况下,就是每遍历一个数,如果跟堆顶进行替换,需要调整10次的情况,也要比排序速度快,而且也不是把所有的内容全部读入内存,可以理解成就是一次线性遍历.


<?php
	//为了测试运行内存调大一点
	ini_set('memory_limit', '2024M');
	//生成小顶堆函数
	function Heap(&$arr,$idx){
	    $left  = ($idx << 1) + 1;
	    $right = ($idx << 1) + 2;

	    if (!isset($arr[$left])){
	        return;
	    }
	    if(isset($arr[$right]) && $arr[$right] < $arr[$left]){
	        $l = $right;
	    }else{
	        $l = $left;
	    }

	    if ($arr[$idx] > $arr[$l]){
	         $tmp = $arr[$idx]; 
	         $arr[$idx] = $arr[$l];
	         $arr[$l] = $tmp;
	         Heap($arr,$l);
	    }
	}

	/*
	  当然这个数据集并不一定全放在内存,也可以在
	  文件里面,因为我们并不是全部加载到内存去进
	  行排序
	*/
	for($i=0;$i<500000;$i++){
	    $numArr[] = $i;    
	}
	//打乱它们
	shuffle($numArr);
	//先取出10个到数组
	$topArr = array_slice($numArr,0,10);
	//获取最后一个有子节点的索引位置
	//因为在构造小顶堆的时候是从最后一个有左或右节点的位置
	//开始从下往上不断的进行移动构造(具体可看上面的图去理解)
	$idx = floor(count($topArr) / 2) - 1;
	//生成小顶堆
	for($i=$idx;$i>=0;$i--){
	    Heap($topArr,$i);
	}

	echo time()."<hr/>";
	//这里可以看到,就是开始遍历剩下的所有元素
	for($i = count($topArr); $i < count($numArr); $i++){
	    //每遍历一个则跟堆顶元素进行比较大小
	    if ($numArr[$i] > $topArr[0]){
	        //如果大于堆顶元素则替换
	        $topArr[0] = $numArr[$i];
	        /*
	          重新调用生成小顶堆函数进行维护,只不过这次是从堆顶
	          的索引位置开始自上往下进行维护,因为我们只是把堆顶
	          的元素给替换掉了而其余的还是按照根节点小于左右节点
	          的顺序摆放这也就是我们上面说的,只是相对调整下,并
	          不是全部调整一遍
	        */
	        Heap($topArr,0);
	    }
	}
	echo "<hr/>";
	var_dump($topArr);
	echo "<hr/>".time()."<hr>";


源文链接:简书  http://www.jianshu.com/p/df71c71cdc57 

php使用openssl_random_pseudo_bytes生成安全的随机数

需要安装openssl扩展,openssl_random_pseudo_bytes


function getRandomString($length = 6)
{
        /*
         * Use OpenSSL (if available)
         */
        if (function_exists('openssl_random_pseudo_bytes')) {
            $bytes = openssl_random_pseudo_bytes($length * 2);

            if ($bytes === false)
                throw new RuntimeException('Unable to generate a random string');

            return substr(str_replace(['/', '+', '='], '', base64_encode($bytes)), 0, $length);
        }

        $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

        return substr(str_shuffle(str_repeat($pool, 5)), 0, $length);
}


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(重新赋值一样),可以触发析构函数的调用
-->


优惠券
广告位-淘宝
最新微语