2014年6月1日 | 标签:

tmux是一个优秀的终端复用软件,类似GNU Screen,但来自于OpenBSD,采用BSD授权。使用它最直观的好处就是,通过一个终端登录远程主机并运行tmux后,在其中可以开启多个控制台而无需再“浪费”多余的终端来连接这台远程主机;当然其功能远不止于此。

2014年1月8日 | 标签: vim
Vim 作为最好用的文本编辑器之一,使用vim来编文档,写代码实在是很惬意的事情。每当学会了vim的一个新功能,就会很大地提高工作效率。有人使用vim几 十年,还没有完全掌握vim的功能,这也说明了vim的强大。而这样何尝不是一件好事呢,只要有的学习,就有的提高。
2013年6月26日 | 标签: boot, linux

 

依然使用UltraISO 来制作,修改引导即可

打开U盘目录下的\syslinux\syslinux.cfg,

将default vesamenu.c32注释为 # default vesamenu.c32

2013年3月11日 | 标签: php, socket

这些Socket函数直接跟互联网的协议进行发送信息。相对于fopensock的流来讲,他们操作在一个比较底层的级别。通常,他们都是对C函数进行封装,并且名称都类似。如果你有使用C进行socket编程的经验,那么使用这些函数将是非常熟练的。我们这里不讨论特别详细的socket编程。
使用这些函数能够解决高层级别函数所不能解决的难题。使用这些函数能够实现类似fopen的功能,你也许有很多方法来实现socket的功能,比如在PHP中使用CLI(Command-line Interface)来实现的Internet守护进程。
resource socket_accept(resource socket)
在你的脚本服务器端中,使用socket_accept接受一个进入的连接。你必须首先产生一个socket,绑定它到一个名字,并且设置它监听一个端口。在块模式中,socket_accept将产生一个唯一接受后的连接。在非块模式中,它没有建立连接则返回false。另外,当你有了一个新的socket资源后就能够进行读写操作。

阅读全文…

2013年3月11日 | 标签: curl, php

curl_multi中,设置CURLOPT_TIMEOUT参数,需要系统curl版本高于7.21.2,否则设置无效。

而curl则没有该限制。

解决方案:升级curl到7.29.0。7.2x解决了很多multi的bug。建议使用multi的升级。

2013年3月4日 | 标签: curl, php

本文将探讨两种具体的实现方法, 并对不同的方法做简单的性能对比.

1. 经典cURL并发机制及其存在的问题

经典的cURL实现机制在网上很容易找到, 比如参考PHP在线手册的如下实现方式:

阅读全文…

2013年2月11日 | 标签: php

大文本慎用!

function is_utf8($string) {
    return preg_match('%^(?:
                        [\x09\x0A\x0D\x20-\x7E] # ASCII
                        | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
                        | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
                        | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
                        | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
                        | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
                        | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
                        | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
                        )*$%xs', $string);

}
2013年2月4日 | 标签:

在元数据操作等小包传送时,发现性能不好,通过调试发现跟socket的TCP_NODELAY有很大关系。
TCP_NODELAY 和 TCP_CORK, 
这两个选项都对网络连接的行为具有重要的作用。许多UNIX系统都实现了TCP_NODELAY选项,但是,TCP_CORK则是Linux系统所独有的 而且相对较新;它首先在内核版本2.4上得以实现。此外,其他UNIX系统版本也有功能类似的选项,值得注意的是,在某种由BSD派生的系统上的 TCP_NOPUSH选项其实就是TCP_CORK的一部分具体实现。 
TCP_NODELAY和TCP_CORK基本上控制了包的“Nagle化”,Nagle化在这里的含义是采用Nagle算法把较小的包组装为更大的帧。 John Nagle是Nagle算法的发明人,后者就是用他的名字来命名的,他在1984年首次用这种方法来尝试解决福特汽车公司的网络拥塞问题(欲了解详情请参 看IETF RFC 896)。他解决的问题就是所谓的silly window syndrome ,中文称“愚蠢窗口症候群”,具体含义是,因为普遍终端应用程序每产生一次击键操作就会发送一个包,而典型情况下一个包会拥有一个字节的数据载荷以及40 个字节长的包头,于是产生4000%的过载,很轻易地就能令网络发生拥塞,。 Nagle化后来成了一种标准并且立即在因特网上得以实现。它现在已经成为缺省配置了,但在我们看来,有些场合下把这一选项关掉也是合乎需要的。 
现在让我们假设某个应用程序发出了一个请求,希望发送小块数据。我们可以选择立即发送数据或者等待产生更多的数据然后再一次发送两种策略。如果我们马上发 送数据,那么交互性的以及客户/服务器型的应用程序将极大地受益。例如,当我们正在发送一个较短的请求并且等候较大的响应时,相关过载与传输的数据总量相 比就会比较低,而且,如果请求立即发出那么响应时间也会快一些。以上操作可以通过设置套接字的TCP_NODELAY选项来完成,这样就禁用了Nagle 算法。 
另外一种情况则需要我们等到数据量达到最大时才通过网络一次发送全部数据,这种数据传输方式有益于大量数据的通信性能,典型的应用就是文件服务器。应用 Nagle算法在这种情况下就会产生问题。但是,如果你正在发送大量数据,你可以设置TCP_CORK选项禁用Nagle化,其方式正好同 TCP_NODELAY相反(TCP_CORK 和 TCP_NODELAY 是互相排斥的)。下面就让我们仔细分析下其工作原理。 
假设应用程序使用sendfile()函数来转移大量数据。应用协议通常要求发送某些信息来预先解释数据,这些信息其实就是报头内容。典型情况下报头很 小,而且套接字上设置了TCP_NODELAY。有报头的包将被立即传输,在某些情况下(取决于内部的包计数器),因为这个包成功地被对方收到后需要请求 对方确认。这样,大量数据的传输就会被推迟而且产生了不必要的网络流量交换。 
但是,如果我们在套接字上设置了TCP_CORK(可以比喻为在管道上插入“塞子”)选项,具有报头的包就会填补大量的数据,所有的数据都根据大小自动地 通过包传输出去。当数据传输完成时,最好取消TCP_CORK 选项设置给连接“拔去塞子”以便任一部分的帧都能发送出去。这同“塞住”网络连接同等重要。 
总而言之,如果你肯定能一起发送多个数据集合(例如HTTP响应的头和正文),那么我们建议你设置TCP_CORK选项,这样在这些数据之间不存在延迟。能极大地有益于WWW、FTP以及文件服务器的性能,同时也简化了你的工作。示例代码如下: 

intfd, on = 1; 
… 

… 
setsockopt (fd, SOL_TCP, TCP_CORK, &on, sizeof (on));  
write (fd, …); 
fprintf (fd, …); 
sendfile (fd, …); 
write (fd, …); 
sendfile (fd, …); 
… 
on = 0; 
setsockopt (fd, SOL_TCP, TCP_CORK, &on, sizeof (on));  
或者
setsockopt(s,IPPROTO_TCP,TCP_NODELAY,(char*)&yes,sizeof(int));

2013年2月4日 | 标签:

阅读注释:

PHP解决方案为:

$instance = new Memcached();
$instance->setOption(Memcached::OPT_TCP_NODELAY, true);

 

原帖地址:http://www.searchtb.com/2012/09/libmemcached_and_memcached_max_buffer.html

最近给服务增加了一个cache_put_latency指标,加了之后,吓了一跳。发现往memcached put一个10KB左右的数据,latency居然有7ms左右,难于理解,于是花了一些精力找原因。我分别写了一个shell和C++的测试程序。

阅读全文…

2013年2月4日 | 标签:

在 a.php 中以 POST 方式向 b.php 提交数据,但是 b.php 下就是无法接收到数据,而 CURL 操作又显示成功.

传递一个数组到CURLOPT_POSTFIELDS,cURL会把数据编码成 multipart/form-data,而然传递一个URL-encoded字符串时,数据会被编码成 application/x-www-form-urlencoded。

代码往往是下面的样子:

$data = array( ‘Title’ => $title, ‘Content’ => $content, ‘ComeFrom’ => $comefrom ); 

curl_setopt($ch, CURLOPT_DNS_USE_GLOBAL_CACHE, false); 

curl_setopt($ch, CURLOPT_URL, ‘http://example.com/b.php’); 

curl_setopt($ch, CURLOPT_POST, 1); 

curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 

curl_exec($ch);

也就是将所要提交的数据以数组的形式通过 POST 发送,而这样就会导致 CURL 使用“错误”的编码“multipart/form-data”,其效果相当于我们直接以“<form method=”post” action=”b.php” enctype=”multipart/form-data”>”这样的表单来完成操作,大家可以试试,这时的“b.php”是无论如何也无法通过 $_POST 来接收数据的。

所以,正确的做法应该是将上述范例代码中的 $data 由数组变为经 urlencode() 编码后的字符串连接,类似:

$data = ‘Title=’ .urlencode($title) . ‘&Content=’ .urlencode($content) . ‘&ComeFrom=’ .urlencode($comefrom);

这样就可以了。

注意:两种发送编码格式的区别,“multipart/form-data” 是把表单设置为MIME编码,目的是用来传输二进制文件的,若想上传文件,必须用这个编码。但是普通的url数据request使用的是“application/x-www-form-urlencoded” 格式, 所以如果传普通数据用2进制格式,对方就无法得不到值了。所以特别注意应该将发送请求的编码确定。

multipart/form-data是支持文件提交的。文件的参数需要之前加上@
$post = array(‘uploadName’ => ‘upload’, ‘upload’ => “@”. realpath($savefile));

WordPress SEO fine-tune by Meta SEO Pack from Poradnik Webmastera