Redis 数据备份与恢复 redis 127.0.0.1:6379> SAVE 将在 redis 安装目录中创建dump.rdb文件 将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可 redis 127.0.0.1:6379> CONFIG GET dir 输出 redis 安装目录http://biezhi.me/nosql/2016-03/redis-data-backup-and-recovery.html
/**
*
*下面只是设置了保存sessionid的那个时间,这样的结果是关闭浏览器后session仍可以用
*实际并没有改变session的生存时间
*
*/
//只会在用户第一次访问的时候设置保存sessionid的那个cookie的过期时间
$lifetime=600;
session_set_cookie_params($lifetime);#注意到放到start的前面
session_start();
//每次都设置保存sessionid的那个cookie的过期时间
$lifetime=600;
session_start();
setcookie(session_name(),session_id(),time()+$lifetime);
//同上,每次都会设置
$lifetime=86400;
session_set_cookie_params($lifetime);
session_start();
session_regenerate_id(true);
/**
* 获取最后一次出错信息,无论如何也能获取到
*
* error_get_last set_error_handler 都不会受环境配置的影响
*
*/
error_reporting(0);
ini_set("display_errors", "off");
set_error_handler(function(){
print_r(func_get_args());
});
echo $a ;
print_r(error_get_last());
#正则中对\的理解
$str = '<a href=\"db.house.qq\"></a>';
#双引号中可以转义的符合会被执行,输出后不在显示转义符
echo "/\\\\\"db.house.qq\\\\\"/" . "\n"; // /\\"db.house.qq\\"/ 总结:在双引号的正则中一个\需要写成 \\
#正则本身的转义符号也需要转义
var_dump(preg_match("/\\\\\"db.house.qq\\\\\"/", $str, $m));
#单引号写法,单引号中的内容不会执行
var_dump(preg_match('/\\\"db.house.qq\\\"/', $str, $m));
print_r($m);
// ?: 匹配但不捕获 加在前面
//? 去贪婪 加在后面
// \1 反向引用
// $1 捕获
$str = 'a a';
preg_match("/(a)(?:\s+)\\1/", $str, $m); #1
echo preg_replace("/(a)(\s+)\\1/", "$1", $str); #a
print_r($m);
#php通过mysql取出的数据库的数据都是字符串类型
file_get_contents() 读取文件要比 fopen/fread 快30倍,但请求外部地址很慢,请用curl替代
null ++ 为1, -- 仍为null 字符串只可以++,相当于最后一个字节加1, --则没效果
//php 1~100 单个输出 记得php.ini中设置 output_buffering = Off
echo str_repeat(' ',1024);
for($i=1;$i<100;$i++)
{
echo $i;
sleep(1);
// ob_flush();
flush();
}
curl 当post超过1024byte时的问题
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
设置头信息(Post请求)
1、curl_setopt ( $ch, CURLOPT_HTTPHEADER, array('Content-type:text/plain') );
file_get_contents('php://input', 'r') 获取到
$_POST 获取不到
2、curl_setopt ( $ch, CURLOPT_HTTPHEADER, array('Content-type:application/x-www-form-urlencoded') );#默认
file_get_contents('php://input', 'r') 获取到
$_POST 获取到
3、curl_setopt ( $ch, CURLOPT_HTTPHEADER, array('Content-type:multipart/form-data; boundary=----WebKitFormBoundarygAvW9MJkUNVmzDjY') );
file_get_contents('php://input', 'r') 获取不到
$_POST 获取到
/**
*
* 传递一个数组到CURLOPT_POSTFIELDS,cURL会把数据编码成 multipart/form-data,
* 而然传递一个URL-encoded字符串时,数据会被编码成 application/x-www-form-urlencoded。
*
*/
$ch = curl_init();
$data = array('name' => 'Foo', 'file' => '@/home/user/test.png;type=xx;filename=xx');
/**
* 用以取代file_get_contents函数,可以设置主机名以及超时时间等设置
* @param $url 主机名
* @param $path 路径
* @param $port=80 端口
* @param $timeout=10 超时设置,单位秒
* @return integer/string -1:连接不上主机 -2:发送请求串失败
*/
function get_file_contents($url,$path,$port=80,$timeout=10)
{
$errno=null;
$errstr=null;
$fp=fsockopen($url,$port);
if(!$fp)
{
return -1;
}
$command='GET '.$path.' HTTP/1.1'."\r\n";
$command.='Accept: */*'."\r\n";
$command.='Accept-Language: zh-cn'."\r\n";
$command.='Host: '.$url."\r\n";
$command.='Connection: Close'."\r\n";
$command.="\r\n";
$flag=fwrite($fp,$command);
if(!$flag)
{
fclose($fp);
return -2;
}
stream_set_timeout($fp,$timeout);
$tmp_ret_str="";
$flag=false;
while(!feof($fp))
{
$tmp_cur_line=fgets($fp,2048);
if($flag)
{
$tmp_ret_str.=$tmp_cur_line;
}
if($tmp_cur_line=="\r\n")
{
$flag=true;
}
}
fclose($fp);
return $tmp_ret_str;
}
/**
* 获取ip地址,注意服务器是双网卡的情况
* @param unknown_type $dest
* @param unknown_type $port
* @return unknown
*/
function my_ip($dest='64.0.0.0', $port=80)
{
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_connect($socket, $dest, $port);
socket_getsockname($socket, $addr, $port);
socket_close($socket);
return $addr;
}
/**
* 判断是否是合法整形 加强版
* @param unknown_type $a
* @return boolean
*/
function is_intval($a) {
return ((string)$a === (string)(int)$a);
}
// true for ("123", "0", "-1", 0, 11, 9011, 00, 0x12, true)
// false for (" ", "", 1.1, "123.1", "00", "0x123", "123a", "ada", "--1", "999999999999999999999999999999999", false, null, '1 ')
/**
* 多进程同时写入一个文件 不支持NFS文件系统
* @param string $filename
* @param string $str
*/
function write($filename, $str) {
$f = fopen ( $filename, "a" );
if (flock ( $f, LOCK_EX )) {
fwrite ( $f, $str );
//sleep(5);
flock ( $f, LOCK_UN );
}
fclose ( $f );
}
write("/home/v_jksong/lock.data", "sjk");
http://www.cnblogs.com/siqi/p/3623630.html
/**
* 获取当前内存情况
* @return string
*/
function memory_usage($isEcho = 0)
{
$memUsage = memory_get_usage();
$unitArr = array("B", "K", "M", "G");
$used = @round($memUsage/pow(1024, ($i=floor(log($memUsage, 1024)))), 2)."".($unitArr[$i]);
if($isEcho)
{
ee($used);
}
return $used;
}
/**
* 一种常用的hash算法
* @param string $str
* @return number
*/
function hash33($str)
{
if(empty($str)) return 0;
$hash = 0;
$seed = 5;
$len = strlen($str);
for ($i = 0; $i < $len; $i=$i+1)
{
$hash = ($hash << $seed) + $hash + ord($str{$i});
$hash = $hash & 0x7FFFFFFF;
}
return $hash;
}
秒拍、微录客解析 PHP使用PDO库查询数据库除了NULL所有字段都返回的是字符串
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); http://www.cnblogs.com/tinywan/p/6143889.html 超600本(优质)教程等你来下载! 程序员专属搜索引擎 Mysql获取每组前N条记录
select * from student group by ClassId order by Score;
group by 先于order by执行,order by是针对group by之后的结果进行的排序,而我们想要的group by结果其实应该是在order by之后.
select * from (select * from student order by Score) group by ClassId;
select * from Employee as e
where (select count(distinct(e1.salary)) from Employee as e1 where e1.DepartmentId = e.DepartmentId and e1.salary > e.salary) < 3;
取GID每组 COL2最大的3条记录
SELECT a.id,a.gid,a.col1,a.col2 FROM t2 a
WHERE 3>=(
SELECT COUNT(*) FROM t2 b
WHERE a.gid=b.gid AND a.col2<=b.col2)
ORDER BY a.gid,a.col2 desc
我们先来获取每个组中的前3名工资最高的员工
select * from Employee as e
where (select count(distinct(e1.salary)) from Employee as e1 where e1.DepartmentId = e.DepartmentId and e1.salary > e.salary) < 3;
where中的select是保证:遍历所有记录,取每条记录与当前记录做比较,只有当Employee表中同一部门不超过3个人工资比当前员工高时,这个员工才算是工资排行的前三名。
http://www.jb51.net/article/31590.htm
按name分组取val最大的值所在行的数据
--方法1:select a.* from tb a where val = (select max(val) from tb where name = a.name) order by a.name
--方法2:
select a.* from tb a where not exists(select 1 from tb where name = a.name and val > a.val)
--方法3:
select a.* from tb a,(select name,max(val) val from tb group by name) b where a.name = b.name and a.val = b.val order by a.name
--方法4:
select a.* from tb a inner join (select name , max(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by a.name
按name分组取最大的两个(N个)val
select a.* from tb a where 2 > (select count(*) from tb where name = a.name and val > a.val ) order by a.name,a.val
select a.* from tb a where val in (select top 2 val from tb where name=a.name order by val desc) order by a.name,a.val
select a.* from tb a where exists (select count(*) from tb where name = a.name and val > a.val having Count(*) < 2) order by a.name
写的顺序:select ... from... where.... group by... having... order by..
执行顺序:from... where...group by... having.... select ... order by...
select * from test group by category_id order by `date` desc
子查询解决方案
select * from (select * from `test` order by `date` desc) `temp` group by category_id order by `date` desc
mysql 中order by 与group by的顺序是:
select
from
where
group by
order by
注意:group by 比order by先执行,order by不会对group by 内部进行排序,如果group by后只有一条记录,那么order by 将无效。要查出group by中最大的或最小的某一字段使用 max或min函数。
例:
select sum(click_num) as totalnum,max(update_time) as update_time,count(*) as totalarticle from article_detail where userid =1 group by userid order by update_time desc
laravel 基础教程 —— 集合 JavaScript: 详解Base64编码和解码 Web 开发调试工具 Livepool Appium python 框架 Swagger UI教程 API 文档神器 搭配Node使用 https://zhuanlan.zhihu.com/p/21353795 JavaScript sdk(jssdk)设计指南 Python爬虫开发(二):整站爬虫与Web挖掘 vuejs学习网站推荐 基于swoole的异步轻量级web框架 php引用方法形成树
/**
* 创建父节点树形数组
* 参数
* $ar 数组,邻接列表方式组织的数据
* $id 数组中作为主键的下标或关联键名
* $pid 数组中作为父键的下标或关联键名
* 返回 多维数组
*
* 分析:
* 由于传递是引用,故当赋值给他后,当这个值在变时,上面的值也会跟着一块变
* 后面的循环不断的给他添加值 第一个元素也会不断的添加值
* 最终所有的树行结构都会放到数组的第一个元素中
* 而下面的元素依次保存当次级别以下的孩子
*
**/
function find_parent($ar, $id='id', $pid='pid') {
foreach($ar as $v) $t[$v[$id]] = $v;
foreach ($t as $k => $item){
if( $item[$pid] ){
if( ! isset($t[$item[$pid]]['parent'][$item[$pid]]) )
$t[$item[$id]]['parent'][$item[$pid]] =& $t[$item[$pid]];
}
}
return $t;
}
/**
* 创建子节点树形数组
* 参数
* $ar 数组,邻接列表方式组织的数据
* $id 数组中作为主键的下标或关联键名
* $pid 数组中作为父键的下标或关联键名
* 返回 多维数组
**/
function find_child($ar, $id='id', $pid='pid') {
foreach($ar as $v) $t[$v[$id]] = $v;
foreach ($t as $k => $item){
if( $item[$pid]) {
$t[$item[$pid]]['child'][$item[$id]] = & $t[$k];
}
}
return $t;
}
$data = array(
array('ID'=>1, 'PARENT'=>0, 'NAME'=>'祖父'),
array('ID'=>2, 'PARENT'=>1, 'NAME'=>'父亲'),
array('ID'=>3, 'PARENT'=>1, 'NAME'=>'叔伯'),
array('ID'=>4, 'PARENT'=>2, 'NAME'=>'自己'),
array('ID'=>5, 'PARENT'=>4, 'NAME'=>'儿子'),
);
$p = find_parent($data, 'ID', 'PARENT');
$c = find_child($data, 'ID', 'PARENT');
$a = 13.2;
$b = 24;
$c = $a/$b;
//实际值是这个d:0.54999999999999993338661852249060757458209991455078125;
echo serialize($c).'<br/>';//
echo $c.'<br/>';//输出时会显示成0.55 实际的值是比他小的
//所以直接和0.55比较大小是不成立的
if($c == 0.55){
echo 'nothing';
}
$c = round($c,2);
//用round处理
if($c == 0.55){
echo 'ok';
}
//强制转为字符串
// $c = (string)$c;
// $c = strval($c);
if("$c" == 0.55){
echo 'ok';
}
function multi_compare($a, $b)
{
$val_arr = array(
'gold'=>'asc',
'silver'=>'desc'//还可以增加额外的排序条件
);
foreach($val_arr as $key => $val){
if($a[$key] == $b[$key]){
continue;
}
return (($val == 'desc')?-1:1) * (($a[$key] < $b[$key]) ? -1 : 1);
}
return 0;
}
$arr = array(
array('gold'=>1, 'silver'=>2),
array('gold'=>8, 'silver'=>10),
array('gold'=>8, 'silver'=>8),
array('gold'=>2, 'silver'=>1),
);
uasort($arr, 'multi_compare');
时间戳实现增量数据同步 where id>x order by id asc limit xx where insert_time>lastmax_timestamp and insert_time<=current_timestamp order by timestamp asc limit xx 不断调整 lastmax_timestamp ,可以每次运行完就把 lastmax_timestamp 存储redis php易错总结
$a = 3;
$b = 5;
var_dump(5 || $b = 7);//boolean(true)
if($a = 5 || $b = 7) { //|| 的优先级比赋值预算的要高
var_dump($a); //boolean(true)
$a++;
$b++;
}
echo $a . " " . $b;//1 6
function timesTwo(&$int) {
$int = $int * 2;
}
$int = 2;
$result = timesTwo($int);
echo $int;//4
$int = 2;
$bool = true;
// 算术运算符和字符串运算符
$a= 1 + 'test'. ($int + $bool);
$b= 'test' . ($int + $bool) + 1;
var_dump($a, $b);//string(2) "13" int(1)
echo -10%3; //-1
//如果 var 不是数组类型或者实现了 Countable 接口的对象,将返回 1,有一个例外,如果 var 是 NULL 则结果是 0。
echo count ("567");//1
echo count(null); //0
echo count(false); //1
//注意这种操作引起的错误
$a = null;
var_dump($a['abc']);//null
explode(',',null)//['']
if($a = 100 && $b = 200) {
var_dump($a,$b);//bool(true) int(200)
}
全球首个微信小程序(应用号)开发教程!通宵吐血赶稿,每日更新 pygments生成图片中的中文
from pygments import highlight
from pygments.lexers import PythonLexer
from pygments.formatters import ImageFormatter
# 可以有中文么a可以的
code = ""
content = highlight(code, PythonLexer(), ImageFormatter(font_name = 'WenQuanYi Zen Hei'))
with open('a.png', 'wb') as handle:
handle.write(content)
handle.close()
'''.decode('utf-8')
# content = highlight(code, PythonLexer(), ImageFormatter(font_name = 'Consolas', line_numbers = False, font_size = 20))
content = highlight(code, PythonLexer(), ImageFormatter(font_name = 'Consolas', cfont_name = 'Microsoft Yahei', line_numbers = False, font_size = 20, cfont_size = 13))
with open('a.png', 'wb') as handle:
handle.write(content)
handle.close()
//静态变量是只存在于函数作用域中的变量,注释:执行后这种变量不会丢失(下次调用这个函数时,变量仍会记着原来的值)
function array_multi2single($array){
static $result_array=array();
foreach($array as $value){
if(is_array($value)){
array_multi2single($value);
}
else
$result_array[]=$value;
}
return $result_array;
}
//采用数组引用来实现,这样比上一种要好哦
function array_multi2single($array,&$rs = array()){
foreach($array as $value){
if(is_array($value)){
array_multi2single($value, $rs);
}
else
$rs[]=$value;
}
}
$array=array("1"=>array("A","B","C",array("D","E")),"2"=>array("F","G","H","I"));
$array=array_multi2single($array);
foreach($array as $value){
echo "<h5>$value</h5>";
echo "<br>";
}
php调用python服务 php通过socket调用python 在线测试SQL:http://sqlfiddle.com linux命令帮助 php curl 异步请求 mysql处理高并发数据,防止数据超读 - 咖啡如同生活的专栏 - 博客频道 - CSDN.NET php中如何设置mysql查询读取数据的超时时间 python抓取taobao ip数据库
import time, unirest
#pip install unirest
def pp(extra):
# 其实这种做法和js很像,用一个闭包限制变量的作用域
def p(resp):
print(extra)
# 在这里做数据的处理和储存
return p
def main():
r = ['192.9.201.0', '192.9.201.255'];
unirest.get('http://ip.taobao.com/service/getIpInfo.php', headers = {}, params = {'ip': r[0]}, auth = (), callback = pp(r))
# taobao访问限制:为了保障服务正常运行,每个用户的访问频率需小于10qps。
time.sleep(.5)
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
# 添加Cookie
driver.add_cookie({'name':'BAIDUID','value':'AAAAAAAAAAAAAA:FG=1'})
driver.add_cookie({'name':'BDUSS','value':'AAAAAAAAAAAAAAAAAAAAAAAAAA'})
# 刷新页面
driver.refresh()
# 获取登录用户名并打印
username = driver.find_element_by_class_name("user-name").text
print(username)
#关闭浏览器
driver.quit()
function getFileSize($size, $format = 'kb') {
$p = 0;
if ($format == 'kb') {
$p = 1;
} elseif ($format == 'mb') {
$p = 2;
} elseif ($format == 'gb') {
$p = 3;
}
$size /= pow(1024, $p);
return number_format($size, 3);
}
function format_bytes($size) {
$units = array(' B', ' KB', ' MB', ' GB', ' TB');
for ($i = 0; $size >= 1024 && $i < 4; $i++) $size /= 1024;
return round($size, 2).$units[$i];
}
if(!empty($webinarIds)){ //srem/sadd 第二个参数如果是空数组会报错
\RedisFacade::srem(Webinar::MASTER_USER_ID_PREFIX.$masterUserId,$webinarIds);
}
if(!empty($wids)){
\RedisFacade::sadd(Webinar::MASTER_USER_ID_PREFIX.$masterUserId,$wids);
}
function calculateFileSize($size)
{
$sizes = ['B', 'KB', 'MB', 'GB'];
$count=0;
if ($size < 1024) {
return $size . " " . $sizes[$count];
} else{
while ($size>1024){
$size=round($size/1024,2);
$count++;
}
return $size . " " . $sizes[$count];
}
}
function calcSize($size,$accuracy=2) {
$units = array('b','Kb','Mb','Gb');
foreach($units as $n=>$u) {
$div = pow(1024,$n);
if($size > $div) $output = number_format($size/$div,$accuracy).$u;
}
return $output;
}
function size2Byte($size) {
$units = array('KB', 'MB', 'GB', 'TB');
$currUnit = '';
while (count($units) > 0 && $size > 1024) {
$currUnit = array_shift($units);
$size /= 1024;
}
return ($size | 0) . $currUnit;
}
function filesize_formatted($path)
{
$size = filesize($path);
$units = array( 'B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
$power = $size > 0 ? floor(log($size, 1024)) : 0;
return number_format($size / pow(1024, $power), 2, '.', ',') . ' ' . $units[$power];
}
function sortSize($a,$b){
$a = getByteSize($a);
$b = getByteSize($b);
if($a == $b){
return 0;
}
return ($a>$b)? 1 : -1;
}
function getByteSize($size){
$base = array(array('KB','K'),array('MB','M'),array('GB','G'),array('TB','T'));
$sum = 1;
for($i=0; $i<4; $i++){
if(stripos($size,$base[$i][0]) || stripos($size,$base[$i][1])){
$size = $sum*str_ireplace($base[$i],'',$size)*1024;
break;
}
$sum*=1024;
}
return $size;
}
$arr = array('23M','1.02G','987MB','45MB','0.98G');
usort($arr,'sortSize');
print_r($arr);
CURL也可以伪造IP,别干坏事哦~~
curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-FORWARDED-FOR:8.8.8.8', 'CLIENT-IP:8.8.8.8'));
ini_set('memory_limit','-1');
$data = file('1000w.txt');
echo $data['1245666'];
$array = array(1,2,4,6,8);
$k = array_slice($array,-1,1);
print_r($k); //结果是一维数组
$a = 10;
while($a--) {
echo $a;//9876543210
}
$a = 10;
while(--$a) {
echo $a;//987654321
}
正则匹配多行
$str='<table>
<tr><td>aaaa</td></tr>
<tr><td>bbbb</td></tr>
<tr><td>cccc</td></tr>
<tr><td>dddd</td></tr>
</table>';
//<tr>.*?<\/tr>/is /<tr>[.\n]*?<\/tr>” (这个是错误的)
preg_match_all('#<tr>(.|\n)*?<\/tr>#',$str,$m);
print_r($m);
$a=$b=$c=0;
for($i=1;$i<6001;$i++){
$temp = rand(0,60);
if($temp<20){
$a++;
}elseif(20<=$temp&&$temp<30){
$b++;
}else{
$c++;
}
}
echo $a;
echo "\n";
echo $b;
echo "\n";
echo $c;
echo "\n";
$a = '234567890';
$b = '111111111111101';
$m = strlen($a);
$n = strlen($b);
$num = $m>$n?$m:$n;
$result = '';
$flag = 0;
while($num--){
$t1 = 0;
$t2 = 0;
if($m>0){
$t1 = $a[--$m];
}
if($n>0){
$t2 = $b[--$n];
}
$t = $t1+$t2+$flag;
$flag = $t/10;
$result = ($t%10).$result;
}
echo $result;
echo "\r\n";
echo $a+$b;
prepare与sql的开销https://segmentfault.com/q/1010000009649587 PHP 的 PDO里面有个选项,叫 ATTR_EMULATE_PREPARES
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 正式的prepare需要把这个设置成false。 数组重组https://segmentfault.com/q/1010000009659423
$arr = array(
array(
'gid' => 1,
'num' => 4,
),
array(
'gid' => 1,
'num' => 4,
),
array(
'gid' => 3,
'num' => 3,
),
array(
'gid' => 4,
'num' => 4,
),
);
$result = array();
foreach($arr as $val) {
if(!isset($result[$val['gid']])) {
$result[$val['gid']] = $val;
continue;
}
$result[$val['gid']]['num'] += $val['num'];
}
var_dump("<pre>", $result);die;
php 计算数组最大最小值https://segmentfault.com/q/1010000009456364
function getMaxAndMin($items){
$newItems=[];
$cutStr=',';//要分割的字符
foreach($items as $item)
{
//保证是String并且包含','
if(is_string($item) && strpos($item,$cutStr)!==false)
{
list($t1,$t2)=explode(',',$item)
$newItems[]=$t1;
$newItems[]=$t2;
}else{
$newItems[]=$item;
}
}
return [min($newItems),max($newItems)];
}
$exampleArr=[
'0,129',
'130,249',
'250,459'
];
list($min,$max)=getMaxAndMin($exampleArr);
function getMaxAndMin($items,$operator=',')
{
$data = explode($operator, join($operator,$data));
return [min($data),max($data)];
}
Accept 可以通过请求的Accept 头部信息来判断,浏览器请求会带上text/html | application/xhtml+xml | application/xml 类似的信息,其中text/html必定会有的,而通过img标签的src是不会有text/html 请求类型的 参考session_decode和session_encode这两个函数,session的序列化与serialize序列化有些区别。
php 数组 如何将 1,2,4,5,6,7,9,11 优雅的转换为 '1,2,4-7,9,11' 这样的字符串呢?https://segmentfault.com/q/1010000009641437
function array_hyphens($arr){
return implode(',',array_reduce($arr,function($a,$num){
if(!($len=count($a))) return array($num);
@list($s,$e) =explode('-',$a[--$len]);
if($s==$num-1 || (isset($e) && $e==$num-1)) $a[$len]=implode('-',array($s,$num));
else array_push($a,$num);
return $a;
},array()));
}
echo array_hyphens([7,11,16,17,18,33,102,103,555]);
// 7,11,16-18,33,102-103,555
在PHP中,如何实现将生成验证码图片 编码为base64https://segmentfault.com/q/1010000009568647
function base64EncodeImage ($image_file) {
$base64_image = '';
$image_info = getimagesize($image_file);
$image_data = fread(fopen($image_file, 'r'), filesize($image_file));
$base64_image = 'data:' . $image_info['mime'] . ';base64,' . chunk_split(base64_encode($image_data));
return $base64_image;
}
求从第一列走到第n列的最短路径https://segmentfault.com/q/1010000008885217 固定时间内不能提交多次?https://segmentfault.com/q/1010000009558772
这个使用redis实现很方便,使用一个key来存储提交次数,假如key为count。每次提交时从redis取出count
如果count为空,将count值设为1,超时时间设为一分钟,正常提交;
如果count值不为空且大于等于5则报错提示“操作频繁,请输入验证码”;
如果count值不为空且小于5,则正常提交,count值加一。
try {
$redis = new Redis(); // 创建实例
$redis->connect(REDIS_HOST, REDIS_PORT, REDIS_TIMEOUT); // 连接
$redis->ping(); // 确认连接已经成功
} catch (Exception $e) {
die('Can not connect Redis.');
}
$incrkey = 'TEST:用户:分钟'; // 每分钟缓存key
$incrValue = $redis->incr($incrkey);
if ($incrValue == 1) {
// 设定缓存时间(键名,缓存时间[单位:秒])
$redis->expire($incrkey, 60);
} else if ($incrValue >= 5) {
die('操作频繁,请输入验证码');
}
PHP 判断二维数组是否再存相同的值https://segmentfault.com/q/1010000009557601
<?php
$test = [
[
'name' => 'a',
'age' => 12,
'number' => 11,
'score' => 50,
],
[
'name' => 'a',
'age' => 12,
'number' => 11,
'score' => 30,
],
[
'name' => 'b',
'age' => 12,
'number' => 12,
'score' => 50,
]
];
根据 name number age 确认是否重复,如果重复则把score相加
$arr = array();
foreach($test as $val) {
$key = $val['name'] . '-' . $val['age'] . '-' . $val['number'];
$arr[$key]['name'] = $val['name'];
$arr[$key]['age'] = $val['age'];
$arr[$key]['number'] = $val['number'];
$arr[$key]['score'] += $val['score'];
}
var_dump("<pre>", array_values($arr));die;
$file = 'path/to/file';
$mode = 0755;
if(@chmod($file,$mode) === false)
throw new \RuntimeException("$file can not change mode to $mode");
sf 用的socket.io 你打开网页的时候用dev-tools就可以看到网络中有类似这样的请求 wss://segmentfault.com:7001/socket.io/?EIO=3&transport=websocket&sid=8r6PgQTb-KLvxevHDkEp PHP中的setlocale()函数对中文无效吗?https://segmentfault.com/q/1010000009514161 setlocale strftime - 根据区域设置格式化本地时间/日期
这两个函数要配合使用,你才能看到效果。 从函数的实现功能方面考虑,而不考虑回调过程来理解递归.https://segmentfault.com/q/1010000009521619
对于一些常用的递归函数功能很好描述,如递归求解阶乘:
<?php
function factorial($n) {
if ($n != 1)
$res = $n * factorial($n-1);
else
$res = 1;
return $res;
}
?>
函数功能就是: 计算 n 的阶乘, 函数功能实现就是: n 的阶乘 = n * (n-1)的阶乘.这样理解就不用考虑递归过程中的函数调用问题.
php如何区分简体中文,繁体中文,日文,韩文https://segmentfault.com/q/1010000009508282
$s = <<<'EOF'
"memolov 爱书 愛書 あいしょ 사랑 때문에 책이 되다",
EOF;
echo $s.PHP_EOL;
if(preg_match_all('/([\x{4e00}-\x{9fa5}]+)/u',$s,$m)){ //中文简体繁体
echo "<pre>";
print_r($m[1]);
echo "</pre>";
}
if(preg_match_all('/([\x{0800}-\x{4e00}]+)/u',$s,$m)){ //日文
echo "<pre>";
print_r($m[1]);
echo "</pre>";
}
if(preg_match_all('/([\x{AC00}-\x{D7A3}]+)/u',$s,$m)){ //韩文
echo "<pre>";
print_r($m[1]);
echo "</pre>";
}
http://pv.sohu.com/cityjson var returnCitySN = {"cip": "223.20.179.161", "cid": "110000", "cname": "北京市"};
PHP秒杀系统的流程是怎样?https://segmentfault.com/q/1010000009462806 不是直接生成订单,所谓队列,就是放入场券在里面,凭券购买!可以都是数字1,也可以其他的来代替!redis是单线程,出队也是按先后的,队列空时返回false。只要用户拿到入场券,立即将该商品放入该用户的购物车,直接走普通的购物流程即可! php如何设计或实现数据统计https://segmentfault.com/q/1010000009385922 mysql不使用索引如何做到不插入重复的数据?https://segmentfault.com/q/1010000009405966 移动端app后端接口是怎么设计的https://segmentfault.com/q/1010000009355135 如果检索到以小数点打头的,则在小数点前面加0 $number = '.5'; $number = preg_replace('/^(.\d+)/', '0$1', $number); 关于过滤用户输入的代码<script>alert(0)</script>https://segmentfault.com/q/1010000009305852
php 的 htmlspecialchars()
前端
`function htmlspecialchars(str)
{
str = str.replace(/&/g, '&');
str = str.replace(/</g, '<');
str = str.replace(/>/g, '>');
str = str.replace(/"/g, '"');
str = str.replace(/'/g, ''');
return str;
} `
session进一步的理解问题,session原理和回收机制。https://segmentfault.com/q/1010000009321211 Redis解决并发导致数据重复插入MySQL的问题?https://segmentfault.com/q/1010000009306401
$lock_status = $redis->get('lock_state');
if ($lock_status == 0 || empty($lock_status)) {
$redis->set('lock_state', 3600, 1); #操作上锁
#操作代码
$redis->set('lock_state', 3600, 0); #操作解锁
} else {
#上锁后的操作
}
php数组排序的笔试题https://segmentfault.com/q/1010000009351470
asort($array, SORT_FLAG_CASE | SORT_NATURAL);
$array = [
0=>"z01",
1=>"Z32",
2=>"z17",
3=>"Z16",
];
function cmp($a,$b){
$a = intval(substr($a, 1));
$b = intval(substr($b, 1));
if ($a == $b) {
return 0;
}
return ($a < $b ) ? -1 : 1;
}
usort($array, "cmp");
print_r($array);
/*
Array
(
[0] => z01
[1] => Z16
[2] => z17
[3] => Z32
)
*/
python输出我想要的格式?https://segmentfault.com/q/1010000009722468
data_input = [('2016-09', 20874.73, '李四'), ('2016-10', 64296.45, '李四'), ('2016-11', 58657.1, '李四'), ('2016-12', 51253.14, '李四'), ('2017-01', 57791.88, '李四'), ('2017-01', 46007.0, '张三'), ('2017-02', 67193.55, '李四'), ('2017-02', 38352.0, '张三'), ('2017-03', 83359.53, '李四'), ('2017-03', 49661.0, '张三'), ('2017-04', 39907.0, '张三')]
import pandas as pd
df = pd.DataFrame(data_input)
df.columns = ['month','value','name']
d = df.set_index(['name'])
print ( set(d.index) ) # {'张三', '李四'}
print ( list(d.loc['张三'].values.tolist()) ) # data變成list
print ( [{'data':list(d.loc[x].values.tolist()) , 'name': x} for x in set(d.index) ] )
4个一维数组的元素能组成多少个一维数组https://segmentfault.com/q/1010000009265535 #这就是求笛卡尔积
from itertools import product print list(product([1,2,3,4], [5, 6], [7,8], [9])) php 在使用is_int函数时,当需要判定的数字超过了9位则返回了falsehttps://segmentfault.com/q/1010000009274936 Integer 整型是有个范围的,而这个范围是跟平台版本有关的32位(最大值为:2^31 - 1)与64位(最大值为:2^63 - 1)的范围不一致。这时候超出范围的数字会被解释为float类型,所以is_int()函数判断会是false,下面是64位的整数溢出: $large_number = 9223372036854775807; var_dump(is_int($large_number)); // true
$large_number = 9223372036854775808; var_dump(is_int($large_number)); // false
如果库存中有10件商品 却有100人购买https://segmentfault.com/q/1010000009303701 以通过数据库的锁来实现
开启事务 select * for update update库存 提交事务 怎么处理 linux 的crond服务 最少是1分钟 phphttps://segmentfault.com/q/1010000009329754 使用systemd的话可以利用systemd.timer设置秒甚至毫秒级定时任务 高并发下悲观锁与乐观锁的选择问题https://segmentfault.com/q/1010000009251675 php怎样进行SHA512withRSA算法签名https://segmentfault.com/q/1010000009257928
function sign($data) {
$certs = array();
openssl_pkcs12_read(file_get_contents("你的.pfx文件路径"), $certs, "password"); //其中password为你的证书密码
if(!$certs) return ;
$signature = '';
openssl_sign($data, $signature, $certs['pkey'],OPENSSL_ALGO_SHA512);
return base64_encode($signature);
}
php出现 3.5527136788005e-15 等形式数据如何优雅地处理https://segmentfault.com/q/1010000009511841 $num = $num < 1 ? 0 : number_format($num, 2); var_dump($num); phpexcel导入用科学计数法表示的数据https://segmentfault.com/q/1010000009511712 最前面加一个单引号。 $num = 1.00E+36; var_dump($num); var_dump(number_format($num)); //返回的是string类型 echo print_r($arr,true); PHP中microtime()函数的两种返回方式精度不同https://segmentfault.com/q/1010000009513580
ini_get('precision') 控制精度为 14 的意思是 :
float(1495449772.2334) 全部有 14 个数字,小数点前 10位,小数点后 4 位,并不是小数点后面 14 位的意思啊。
看看小面代码的结果吧。
ini_set('precision', 18);
var_dump(microtime());
var_dump(microtime(true));
PHP处理超长数据内存限制问题https://segmentfault.com/q/1010000009566903
如果是php7的话不能使用preg_replace,需要换成preg_replace_callback来处理
$str=$_POST['str'];//点的4个属性组成的字符串
$json_str = '['.substr(preg_replace('/([^,]+),([^,]+),([^,]+),([^,]+),/iU','{"x":"$1","y":"$2","a":"$3","p":"$4"},',$str.','),0,-1).']';
//将json字符串保存在```.txt```文件中
$handle=fopen("./1.txt","w");
fwrite($handle, $json_str);
fclose($handle);
$math = '%s*%s';
$str = sprintf($math, 5, 6);
$result=eval("return $str;");
var_dump($result);
php 批量插入10w 条内容导致内存撑爆128mb 怎么处理
自己生成一张id表(只存id一个字段),记录10w条(0-10w)
mysql做法:
insert into table t
select i.id, concat('名字', i.id) name,
concat('随机生成码7-12:',FLOOR(7 + (RAND() * 6))) rand,
ifnull(a.nickname, 'No nickname') nickname,
uuid() descript, --随机字符串
from_unixtime(unix_timestamp("20170101000000")+FLOOR((RAND()*60*60*24*365))) --2017年中随机日期
from table_id i
left join table_account a on a.id=FLOOR((RAND()*12)) --如果数据来源另外一些表
where i.id < 1000 --如果只要生成1000条
mysql中You can't specify target table for update in FROM clause错误
delete from tbl where id in
(
select max(id) from tbl a where EXISTS
(
select 1 from tbl b where a.tac=b.tac group by tac HAVING count(1)>1
)
group by tac
)
改写成下面就行了:
delete from tbl where id in
(
select a.id from
(
select max(id) id from tbl a where EXISTS
(
select 1 from tbl b where a.tac=b.tac group by tac HAVING count(1)>1
)
group by tac
) a
)
如何降低Laravel artisan 报错级别https://segmentfault.com/q/1010000009623981 框架代码位置:Illuminate\Foundation\Bootstrap\HandleExceptions::bootstrap() php 解压.gz文件格式的方法。
$file_name = 'file.txt.gz';
// Raising this value may increase performance
$buffer_size = 4096; // read 4kb at a time
$out_file_name = str_replace('.gz', '', $file_name);
// Open our files (in binary mode)
$file = gzopen($file_name, 'rb');
$out_file = fopen($out_file_name, 'wb');
// Keep repeating until the end of the input file
while(!gzeof($file)) {
// Read buffer-size bytes
// Both fwrite and gzread and binary-safe
fwrite($out_file, gzread($file, $buffer_size));
}
// Files are done, close files
fclose($out_file);
gzclose($file);
$arr = array(
array(
'id' => 10,
'parent_id' => 9
),
array(
'id' => 9,
'parent_id' => 5
),
array(
'id' => 5,
'parent_id' => null
),
);
function getParentId($arr, $id = 10) {
foreach ($arr as $val) {
if($val['id'] == $id) {
if(!empty($val['parent_id'])) {
$id = $val['parent_id'];
getParentId($arr, $id);
}else {
return $id;
}
}
}
return $id;
}
echo getParentId($arr, 10);
larave session问题,为什么每次session_id都要变 一切都是在EncryptCookies中进行的
\App\Http\Middleware\EncryptCookies::class
larave_session
先经过base64_decode,在json_decode在进行一些列验证 然后通过openssl_decrypt解密出真正存储在redis或其他drive里面的session_id
php使用curl处理文件下载url连接 一般返回数据的使用curl处理数据的方法会使用 把返回的content用file_put_contents写入就行了
file_put_contents(DIR.'/yourfilename.ext', $response);
python每隔10秒运行一个指定函数怎么实现呢 Python如何把两个列表相减呢? A = [item for item in A if item not in set(B)] a = ['2016-01-01','2016-01-02','2016-01-03','2017-06-01', '2016-03-08'] b = ['2016-03-02','2016-03-08',] print set(a) - set(b) 如何测试ip响应时间,可以设置毫秒级超时
#coding=utf8
import os
ip_list=['192.168.0.1','192.168.0.2','192.168.0.3','192.168.0.106']
for each in ip_list:
a=os.popen('ping -n 1 %s'%each).read().decode('gbk')
b=a.find('=')
c=a.find('ms')
time=a[b+7:c]
try:
if int(str(time))>=500:
print 'time >= 500ms'
else:
print each+' : '+time+'ms'
except Exception as e:
print 'lost'
proxies在你访问http时用http的设置,访问https时用https的设置所以你的proxy需要同时包含http及https的配置,这样才能生效
proxy = {
'http': 'http://117.85.105.170:808',
'https': 'https://117.85.105.170:808'
}
如何用Python计算100以内的素数 从 2 到 sqrt(n): 存在一个 n 为因数,不为素数,返回 False 不存在,为素数,返回 true 正常输出中文没有乱码,zip函数之后出现中文编程unicode编码的问题,我是遍历输出的啊。
因为zip将每两个独立的字符串, 组合成了一个元组, 而中文在元组,列表等等这些数据结构中, 是按照unicode或者十六进制存储, 所以你看到的会是这个结果, 这些不影响使用, 也不是乱码, 因为直接遍历出来, 将元素单独打印出来, 就能看到人可识别的内容了, 可以用下面的代码帮助理解:
# coding: utf8
a = u'你好'
print a # 独立打印
s = [] # 创建列表, 并存入列表
s.append(a)
print s # 将整个列表打印, 看到unicode编码存储的内容
print s[0] # 将元素单独打印, 看到正常的内容
#### 输出 ###
你好
[u'\u4f60\u597d']
你好
'<abc>' 遇到这样的html转义符如何自动转义呢?
from html.parser import HTMLParser
html_parser = HTMLParser()
s = '<abc> '
txt = html_parser.unescape(s)
print(txt)
# 结果:<abc>
Python 3 转成Python 2,安装 3to2
安装: pip install 3to2, 运行: 3to2 file.py, 具体怎么用 看3to2 --help
r'(?<=[A-Z]{3})([a-z])(?=[A-Z]{3})'
>>> import re
>>> rawstring = 'aAFDdADDdDFDsDFS'
>>> reg = r'(?<=[A-Z]{3})([a-z])(?=[A-Z]{3})'
>>> pattern = re.compile(reg)
>>> pattern.findall(rawstring)
['d', 'd', 's']
如果是numpy的话,可以使用numpy.savetxt直接进行保存为文件。
建议使用生产消费者模式,生产者多个线程向队列里写log,消费者从队列里取log写入日志
算法高手看过来https://segmentfault.com/q/1010000009551198 关于json中获取多个key-value对中多层嵌套key的namehttps://segmentfault.com/q/1010000009698900 使用pip3 install lxml -v 打印更多信息,我估计系统没装libXXXdev所致 Python的一个列表赋值问题https://segmentfault.com/q/1010000009674963 编程,算法的问题https://segmentfault.com/q/1010000009642781 python 如何将字符串转换成列表
# 第一种:
>>> a = u"我是中国人"
>>> s = list(a)
>>> print s
[u'\u6211', u'\u662f', u'\u4e2d', u'\u56fd', u'\u4eba']
>>> print s[1]
是
# 第二种
>>> a = "我是中国人"
>>> s = a.decode('utf8')
>>> s = list(a.decode('utf8'))
>>> s
[u'\u6211', u'\u662f', u'\u4e2d', u'\u56fd', u'\u4eba']
>>> print s[1]
是
var_export(preg_split('##u', '中国人民银行', null, PREG_SPLIT_NO_EMPTY));
// array(0=>'中',1=>'国',2=>'人',3=>'民',4=>'银',5=>'行')
strip是去除左右两端的空格,中间的空格去除不了。
replace不能用正则表达式做参数,要用 re模块。
import re
re.sub('\s+', ';', 'w w')
函数里有两个值a、b,要求,返回a的概率是65%,b返回的概率35%
if random(0,1) < 0.65
return a
else
return b
php如何将字符串的网址替换成a标签,求完善https://segmentfault.com/q/1010000009732553 php 数组改造https://segmentfault.com/q/1010000009729734
$old = array(
'17' => '1',
'11' => '2',
'10' => '6',
'9' => 1
);
$new = array_chunk($old, 1, true);
foreach ($new as $key => &$val) {
array_unshift($val, $key);
}
Python 如何匹配汉语拼音?https://segmentfault.com/q/1010000009553095 import re regex = re.compile(r'\b[a-z][āáǎàōóǒòêēéěèīíǐìūúǔùǖǘǚǜüńňǹɑɡ]+[a-z]\b') text = "Thǐs ís à pìnyin abóut shá" m = regex.findall(text) print(m) 我提交的Composer包无法requirehttps://segmentfault.com/q/1010000009724384 Could not find package changwei/array2text at any version for your minimum- stability (stable). Check the package spelling or your minimum-stability 你要在github发布release才可以,不然你只能用dev-master版本 为什么php 可以通过 :: 直接调用类的非静态方法https://segmentfault.com/q/1010000009702914
class Demo
{
public function testing()
{
echo "testing\n";
}
}
Demo::testing();
php 大神看看一个数组问题https://segmentfault.com/q/1010000009691691
$a = "[['7','2'],['8','2'],['11','2'],['10','2'],['9','2']]";
$result = array();
preg_match_all("/'(\d*)'/", $a, $matches);
for ($i = 0; $i < count($matches[1]); $i += 2){
$result[(int)$matches[1][$i]] = (int) $matches[1][$i+1];
}
$str = "[['7','2'],['8','2'],['11','2'],['10','2'],['9','2']]";
var_dump(eval('return '.$str.';'));
$sqldata = "[['7','2'],['8','2'],['11','2'],['10','2'],['9','2']]";
$sqldata = str_replace('\'', '\"', $sqldata );
$data = json_decode($sqldata);
echo $data[0][1]; // >> 2
composer不知什么原因,遇到https,就会报SSL: Handshake timed out,Google也没结果https://segmentfault.com/q/1010000009709439 打开php.ini, 将default_socket_timeout值调大。如:default_socket_timeout=360(默认为-1或60) 拖曳排序保存問題 php mysqlhttps://segmentfault.com/q/1010000009720109 拖拽的结果只是改变排序字段的数值,删掉一个肯定不会乱掉的,逻辑有问题 三元运算符结合方向的问题https://segmentfault.com/q/1010000009685491 java 从右向左。等效于3<8?(9<6?7:5):(2>0?4:1) php 从做向右。等效于(3<8?(9<6?7:5):2)>0?4:1
js怎么用正则找出一个字符串里两个特定字符之间的字符串呢?https://segmentfault.com/q/1010000009676831
function pick(str){
var reg = /@([^\s]*?)\s/g, ret = [];
while(arr = reg.exec(str)) ret.push(arr[1]);
return ret;
}
pick("@3131 @aba21bas @zxcc@213wd cccaf21212" )
请问php中如何将查询出来的结果数组转化成自己想要的格式https://segmentfault.com/q/1010000009674939 https://github.com/TIGERB/easy-tips php版本在5.6及之后,且在保证$Myconfig['Cookie']的下标顺序与setcookie的参数顺序一致的情况下,可以写成setcookie(...$Myconfig['Cookie']) //定义各个数组 $MyConfig['Cookie'] = array( 'name' => $cookie_name, 'value' => $cookie_value, 'expire' => $cookie_expire, 'path' => $cookie_path, 'domain' => $cookie_domain, 'secure' => $cookie_secure, 'httponly' => $cookie_httponly, ); ThinkPHP无限分类https://segmentfault.com/q/1010000009620383
public function gettree($items, $parent_id = 'parent_id', $id = 'id'){
$tree = array(); //格式化好的树
if(empty($items)){
return $tree;
}
foreach ($items as $item){
if (isset($items[$item[$parent_id]])){
$items[$item[$parent_id]]['son'][] = &$items[$item[$id]];
}else{
$tree[] = &$items[$item[$id]];
}
}
return $tree;
}
private function getTreeList($data, $pid = 0)
{
$resultarr = array();
foreach ($data as $teamdata) {
if ($teamdata['pid'] == $pid) {
$team_data = $teamdata;
$children_data = $this->getTreeList($data, $teamdata['id']);
$team_data['children'] = $children_data;
$resultarr[] = $team_data;
}
}
return $resultarr;
}
PHP use 命名空间时,为什么要精确到命名空间下的一个类https://segmentfault.com/q/1010000009664741