php安装gd扩展

做php开发经常需要用到gd库,但是也遇到几次部署环境默认没有安装gd的情况,遂在此做下总结,以备不时之需.

通过yum,apt-get等包式管理安装方式安装的php直接运行对应命令即可,故不在此赘述。本文主要记录在linux环境下编译gd扩展及其所需依赖。

gd扩展主要依赖zlib,freetype,libpng,libjpeg这4个库,所以我们先编译这四个库。

- 阅读剩余部分 -

php利用反射优雅的实现工厂

php的反射机制可以带参构造对象,利用这个特性可以很方便的实现工厂:

function factory($class, $args){
  if(class_exists($class)){
    return (new \ReflectionClass($class))->newInstanceArgs($args);
  }
}

$db = array(
  'PDO',
  array(
   'mysql:dbname=test;host=localhost',
   'root',
   'root',
   array(PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC)
  )
);

var_dump(factory($db[0], $db[1])->query('show tables')->fetchAll());

阻塞channel优先返回给主线程

昨天在别人发了个用golang的channel写菲波拉契数列的代码,说是有问题,然后我试着撸一个,结果发现管道阻塞状态下的一个trap,就是当主线程和子线程同时阻塞一个管道时,当管道有了数据是优先返回给主线程的.测试代码如下:

package main

import (
    ."fmt"
)

func fbi(num int,ch chan int){
    if num<3 {
        ch<-num;
    }else{
        /*
        cl:=make(chan int);
        go fbi(num-2,cl);
        tmp:=<-cl;
        cr:=make(chan int);
        go fbi(num-1,cr);
        tmp+=<-cr;
        ch<-tmp;
        */
        go fbi(num-2,ch);
        r:=<-ch;
        Println("in go");
        go fbi(num-1,ch);
        l:=<-ch;
        ch<- (l+r);
    }
}

func main(){
    ch:=make(chan int);
    go fbi(10,ch);
    Println(<-ch);
    Println("in main go");
}

不使用smtp直接发送邮件

用smtp发邮件挺蛋疼的,不是有配额限制就是有配额限制.所以我觉得应该有直接发送邮件的办法.回归到用命令行装逼的年代,我们是这样发信的:

C:\>nslookup
默认服务器:  google-public-dns-a.google.com
Address:  8.8.8.8
> set type=mx
> qq.com
服务器:  google-public-dns-a.google.com
Address:  8.8.8.8
非权威应答:
qq.com  MX preference = 10, mail exchanger = mx3.qq.com
qq.com  MX preference = 20, mail exchanger = mx2.qq.com
qq.com  MX preference = 30, mail exchanger = mx1.qq.com
C:\>telnet mx3.qq.com 25
220 newmx13.qq.com MX QQ Mail Server
HELO localhost
250 newmx13.qq.com
MAIL FROM:<eslizn@localhost>
250 Ok
RCPT TO:<10000@qq.com>
250 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
hello!
.
550 Mail content denied. //service.mail.qq.com/cgi-bin/help?subtype=1&&id=20022&&no=1000726
QUIT

- 阅读剩余部分 -