同步目录到七牛CDN

基于七牛SDK实现目录上传和同步

使用官方提供的PHP SDK实现,重新使用PHP实现目录同步,而不是使用官方提供的Windows 程序,主要是因为 qrsbox.exe 会同步目录下的所有文件,包括 .svn 文件和一些项目配置文件,如 .project

七牛的PHP SDK下载地址:http://developer.qiniu.com/code/v7/sdk/php.html

本次实现的源码有几个功能:

  1. 同步普通文件,不同步英文点号开始的文件,比如 .svn、.project
  2. 将同步日志直接存放在同步的目录下,跟随 svn 进行管理
  3. 多机使用 svn 管理目录,在多机上进行同步,不会将整个项目重新同步,qrsbox.exe 将同步日志存放在 C 盘的用户目录,每在一台机器 checkout 项目,进行同步时都会完整地同步一次
  4. 通过 bat 脚本调用 php 代码,认证信息和 bucket 信息配置在源码中,每个 bat 脚本对应各自的 bucket,不再像 qrsbox.exe 切换 bucket 需要重新配置
  5. 增量同步,基于同步日志实现

PHP脚本每次执行都会比较目录下的所有文件,以此判断是否需要同步。

同名不同内容文件上传时会提示文件已存在,先删除旧文件,再提交新文件。

没有实现的功能:

  1. 目录监控,实时上传(比较少遇到实时将开发环境代码更新到生产环境)
  2. 断点续传(CDN较多存放小文件)
  3. 没有实现同步文件删除(同 qrsbox.exe)

PHP 魔术变量

所有魔术变量表示的值均区分大小写

__CLASS__

表示代码所在类的名字

// 文件 define.php
namespace Base
{
    abstract class Fruit
    {
        public function __construct()
        {
            // 输出 Base\Fruit
            echo __CLASS__;
            echo "\n";
            // 输出 Sub\Apple
            echo get_class($this);
            echo "\n";
        }

        public function hello()
        {
            // 输出 Base\Fruit
            echo __CLASS__;
            echo "\n";
        }
    }
}

namespace Sub
{
    class Apple extends \Base\Fruit
    {
        public function say()
        {
            // 输出 Sub\Apple
            echo __CLASS__;
            echo "\n";
        }
    }
}

// 文件 test.php
require __DIR__ . '/define.php';

$Apple = new Sub\Apple();
$Apple->hello();
$Apple->say();

__DIR__

表示代码所在文件所在的完整目录名,等价于 dirname(__FILE__),不包括末尾的斜杠 /

// 文件 test.php
// 输出 test.php 所在目录 /opt/wwwroot/test
echo __DIR__;
echo "\n";

__FUNCTION__

表示代码所在函数的名称

function foo()
{
    // 输出函数名 foo
    echo __FUNCTION__;
    echo "\n";
}
foo();

__FILE__

表示代码所在文件的完整路径名

// 文件 test.php
// 输出 test.php 所在目录 /opt/wwwroot/test/test.php
echo __FILE__;

__LINE__

表示代码所在文件中的行号

// 文件 test.php
// 输出代码行号
echo __LINE__;

__METHOD__

表示代码所在函数的名称

// 文件 define.php
namespace Base;

function foo()
{
    // 输出函数名 Base\foo
    echo __FUNCTION__;
    echo "\n";
    // 输出函数名 Base\foo
    echo __METHOD__;
    echo "\n";
}

class Foo
{
    public function bar()
    {
        // 输出函数名 bar
        echo __FUNCTION__;
        echo "\n";
        // 输出方法名 Base\Foo::bar
        echo __METHOD__;
        echo "\n";
    }

    public static function staticBar()
    {
        // 输出函数名 staticBar
        echo __FUNCTION__;
        echo "\n";
        // 输出方法名 Base\Foo::staticBar
        echo __METHOD__;
        echo "\n";
    }
}

// 文件 test.php
require __DIR__ . '/define.php';

Base\foo();

$foo = new Base\Foo();
$foo->bar();
$foo->staticBar();

__TRAIT__

表示代码所在 trait 的名称,包含完整限定的 namespace

// 文件 define.php
namespace Base
{
    trait Wheel
    {
        public function roll()
        {
            // 输出 Base\Wheel
            echo __TRAIT__;
            echo "\n";
            // 输出 Sub\Car
            echo __CLASS__;
            echo "\n";
        }
    }
}

namespace Sub
{
    class Car
    {
        use \Base\Wheel;

        public function start()
        {
            $this->roll();
            // 输出空字符串
            echo __TRAIT__;
            echo "\n";
            // 输出 Sub\Car
            echo __CLASS__;
            echo "\n";
        }
    }
}

// 文件 test.php
require __DIR__ . '/define.php';

$car = new Sub\Car();
$car->start();

__NAMESPACE__

表示当前代码所在命名空间

namespace Vendor\Util;

// 输出命名空间 Vendor\Util
echo __NAMESPACE__;
echo "\n";

function foo()
{
    // 输出命名空间 Vendor\Util
    echo __NAMESPACE__;
    echo "\n";
}

foo();

PHP 超全局变量

PHP 超全局变量(Superglobal)是自动化的全局变量,在任何作用域都可以使用,不需要使用 global 关键字声明 $variable。

变量名 说明
$GLOBALS 引用了全部全局变量的数组,如 $GLOBALS[‘_GET’]、$GLOBALS[‘_POST’] 等等,以及一个对自身 GLOBALS 的引用。
$_COOKIE PHP 解析浏览器请求携带的 cookie 生成的数组
$_ENV $_ENV 包含当前的环境变量,与 phpinfo() 输出的 Environment 表格一致,但默认为空,通过 getenv() 可以获取到指定的环境变量
$_FILES $_FILES 包含当前 HTTP POST 上传的文件列表。
$_GET $_GET 包含 URL 参数列表
$_POST $_POST 包含 POST 参数列表
$_REQUEST 可能包含 $_GET、$_POST、$_COOKIE,不包含 $_FILES。 request_order 控制包含的参数列表。
$_SERVER 包含服务器和脚本执行环境信息,比如 HTTP 请求头信息、脚本信息,不同服务器信息会有不同。
$_SESSION 包含当前 SESSION 变量列表。需要先调用 session_start() 开启会话。
$argc 以命令行(CLI)形式运行 PHP 脚本,传递给脚本的参数总数。需要开启 register_argc_argv
$argv 以命令行(CLI)形式运行 PHP 脚本,传递给脚本的参数数组。需要开启 register_argc_argv
$http_response_header 保存当前作用域下最新 HTTP 请求的的响应头信息
$php_errormsg 开启 track_errors 时,PHP 执行的最新错误信息

$GLOBALS

$name = 'Seven';
function hello() {
	$name = 'Eight';
	echo "local name is $name"; // Eight
	echo "\n",
	echo "global name is "
		. $GLOBALS['name']; // Seven
}

php.ini 中的 register_globals(在 PHP 5.4.0 中被移除)表示将 globals 变量中的成员自动注册为全局变量。

// 设置 register_globals = on;
$_GET['name'] = 'Seven';
$name === $_GET['name']; // true

// 设置 register_globals = off;
// 不会将 global 变量中的成员自动注册为全局变量

$_COOKIE

$_COOKIE 包含当前请求的 cookie 列表,在请求中使用 setcookie 再调用 $_COOKIE 不会立刻获得相同的值。

// 设置 cookie
setcookie('name', 'Seven');
// 获取 cookie
$_COOKIE['name'] // 不能立刻获得设置的 cookie
// 因为 $_COOKIE 存放的是当前浏览器发送到服务器的 cookie
// 其次, setcookie 不一定设置 cookie 成功

$_ENV

默认的 $_ENV 数组为空,是因为 variables_order可能没有包含 E —— _ENV。

CEGPS 分别对应 $_COOKIE、$_ENV、$_GET、$_POST、$_SERVER,variables_order 的默认值没有包含 E,因此不会设置超全局变量 $_ENV。variables_order 为空则不会设置任何超全局变量。

$_FILES

$_FILES 包含的是文件列表,是一个二维数组,一般结合 move_uploaded_file() 将上传的文件存放到需要的位置,类似结构如下:

array(
	// myfile 是 input 表单的 name 属性
	'myfile' => array(
		'name' => '', // 文件的原名称
		'type' => '', // 文件的 MIME 类型
		'size' => '', // 文件的字节大小
		'tmp_name' => '', // 存放的包含路径的临时文件名
		'error' => '', // 上传的错误代码
	);
);
// 如果 php 对 upload_tmp_dir 没有写入权限,
// 则上传的文件无法存放在文件系统上

$_GET

$_POST

$_POST 只解析类似 URL 参数列表结构的 POST BODY 中的数据,比如将 name=Seven 解析为 $_POST[‘name’] = Seven,调用 AJAX XMLHttpRequest 的 send() 方法传递的字符串一般类似 name=Seven&age=20。
$_POST 不能解析文件流,也不能解析 send() 的 JSON 字符串,需要使用 @file_get_contents(‘php://input’) 获取 POST 的内容,再进行解析——比如 json_decode 获得 JSON,base64_decode 获得二进制流。

$_REQUEST

// request_order = 'GP'
// 表示 $_REQUEST 包含 $_GET、$_POST 内容
// 同名 key 后者覆盖前者

// request_order = 'GPC'
// 表示 $_REQUEST 包含 $_GET、$_POST、$_COOKIE 内容

$_SERVER

$_SERVER['HTTP_HOST'] // HTTP 请求的主机
$_SERVER['HTTP_USER_AGENT'] // HTTP 请求 User-Agent
$_SERVER['HTTP_COOKIE'] // HTTP 请求 COOKIE
$_SERVER['HTTP_ACCEPT_LANGUAGE'] // 可以接受的语言列表
// 与 HTTP 请求相关的信息大部分以 HTTP_ 开始

get_defined_functions

返回一个二维数组,包含定义的函数名列表:区分 internal、user。

// get_defined_functions 返回值
array (
	'internal' => array (
		'zend_version',
		'func_num_args',
		'func_get_arg',
		// ...
	),
	'user' => array (
		'get_client_ip',
		'get_client_device',
		'get_client_browser',
	),
);

get_defined_constants

返回定义的常量数组,常量名作为 key,常量值作为 value。

get_defined_vars

返回定义的变量数组。

extract

将数组的成员导入到当前作用域。

$a = array(
	'b' => 'b',
);
extract($a);
echo $b; // 输出字符串 b
// 如果数组的成员与当前变量名重名会发生什么?

整合 Advanced lazy load 与 Responsive Lightbox

因为博客文章展示页面宽度有限制,一些文章使用到的图片原始宽度会超出,导致图像显示时必须压缩宽度,使得图像模糊。比如浏览器如何加载网页 — JavaScript PerformanceTiming中的第一张图片。所以考虑增加一个图像浏览插件,使得点击图像使得点击图片使能够弹出较大的对话框,尽可能按原始宽度展示图像。

今天尝试了几款,最终选择了 Responsive Lightbox by dFactory

启用 Responsive Lightbox

在使用这款插件时遇到了几个问题:

  1. 文章的图像没有设置链接,点击图像没有响应
  2. 文章的图像使用了懒加载,无法识别正确的图像地址

关于第一点,在试用的插件中均遇到了这个问题,也就意味着即使今后在文章中添加图片时一并添加链接,以前的文章仍然无法使用这个功能。(修改所有历史文章不是一个明智的选择)

关于第二点,由于这些插件都没有解决第一个问题,所以刚开始考虑把懒加载去掉。

查看了一下 Responsive Lightbox 的文件 responsive-lightbox/js/front.js ,发现它是查询特定 a 标签:

$( 'a[rel*="' + rlArgs.selector + '"], a[data-rel*="' + rlArgs.selector + '"]' )

设想可以通过 JavaScript 给图片追加 a 标签:

$('img[src]').each(function() {
	var src, img = $(this);
	if (img.parent().prop('tagName') == 'A') {
		return;
	}
	// 1, 兼容 lazy load; 2, 兼容未设置链接的图片
	src = img.attr('imageholder') || img.attr('src');
	if (src) {
		$('<a data-rel="' + rlArgs.selector + '[lightbox[gallery-AAAA]" href="' + src + '" target="_blank"></a>')
			.insertBefore(img)
			.append(img);
	}
});

if (window.innerWidth < 480) {
	return false;
}

判断 window.innerWidth,是因为在手机上展示效果不够理想。

至此,在改动较少且不影响体验和增加图片下载的前提下整合了 Advanced lazy loadResponsive Lightbox

phpDocumentor 使用介绍

开发 PHP 不像开发 Java 有较强的文档注释规范,通过注释可以便捷地生成接口文档。

我在寻找 PHP 接口文档工具时使用过 phpDoc,页面效果不怎么好。辗转使用了 phpDocumentor,页面效果可以接受。

phpDocumentor output

使用 phpDocumentor 步骤(仅在 Windows 系统验证通过):

首先安装 php5

下载 phpDocumentor.phar 文件

访问百度盘 http://pan.baidu.com/s/1bnErGXh 下载 phar 文件。

在 PHP5 目录(php.ini 所在的目录)下创建 phar 目录,并把 phpDocumentor.phar 移动到该目录。

进入 PHP5 目录,打开 cmd 命令窗口,执行 phpDocumentor 命令

php phar\phpDocumentor.phar -d D:\ran\framework -t D:\zhengxianjun_cdn\www\ran-api

-d 参数表示源代码目录

-t 参数表示生成的接口文档存放目录

命令执行完成之后会在 D:\zhengxianjun_cdn\www\ran-api\reports\errors.html 记录下源代码中接口描述不规范的点,逐条修改即可。

phpDocument 生成的接口文档的样式中模式会使用 Google 的字体,在国内自然打不开,导致网页打开很慢。找到 D:\zhengxianjun_cdn\www\ran-api\css\template.css,删除第一行的 @import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro);。因为每次生成接口文档都会覆盖 template.css,另一个一劳永逸的办法是在 hosts 文件中加上 127.0.0.1 fonts.googleapis.com

phpDocument 生成的接口文档适配手机网页,但查看不是很便捷。

使用 phpDocument,就需要按照它的规范来抒写代码注释。

phpDocument 代码注释规范:http://www.phpdoc.org/docs/latest/index.html

支持 28 个标签,有些标签没有完全实现,但实际常用的标签就 10 个左右。

在注释文档中支持部分 html 标签,例如

phpDocument source code

对应的展示效果如下

phpDocumentor 效果

想要编写复杂的代码示例仍然不是很容易,但通过注释生成接口文档基本已满足我的需求。

想要细致了解 phpDocument.phar 文件的用法,可以通过 php phar\phpDocumentor.phar –help 命令获得帮助。

示例站点

PHP Ran Framework 的接口文档便是通过 phpDocumentor 创建的 http://ran-api.qiniudn.com

PHP 图片压缩、图片缩放

使用 PHP 进行图片压缩,首先通过 imagecreatefrom* 系列函数创建源图像 resource 对象,再通过 imagecreate 或者 imagecreatetruecolor 函数创建确定宽度和高度的目标图像对象,接着进行一系列处理,最后通过 imagecopy* 系列函数把源图像对象拷贝到目标图像对象。完成上述处理之后,调用 imagegif、imagejpeg、imagepng 把目标图像对象转换为图像字符串输出到文件或者浏览器。似乎没有直接把图像对象转换为字符串的函数?可以通过 ob_start 捕获字符串输出,并调用 ob_get_clean 取得字符串。

imagecreatefrom* 系列函数

imagecreatefromgd 从 GD 文件或 URL 创建图像对象
imagecreatefromgd2 从 GD2 文件或 URL 创建图像对象
imagecreatefromgif 从 gif 文件创建图像对象
imagecreatefromjpeg 从 jpeg/jpg 文件创建图像对象
imagecreatefrompng 从 png 文件创建图像对象
imagecreatefromwbmp 从 wbmp 文件创建图像对象
imagecreatefromwebp 从 webp 文件创建图像对象
imagecreatefromxbm 从 xbm 文件创建图像对象
imagecreatefromxpm 从 xpm 文件创建图像对象
上述所有函数全部接收一个参数 — $filename, 失败时均会返回 false
imagecreatefromstring 从字符串创建图像对象
接收一个参数 — 图像二进制字符串

imagecopy* 系列函数

imagecopy 拷贝图像的一部分
imagecopymerge 拷贝并合并图像的一部分
imagecopymergegray 用灰度拷贝并合并图像的一部分
imagecopyresampled 重采样拷贝部分图像并调整大小
imagecopyresized 拷贝部分图像并调整大小

图片压缩实现代码

$image = 'D:\TEMP\woxinfeishi-bukezhuanye.jpg';
$source = imagecreatefromjpeg($image);

$s_width = imagesx($source);
$s_height = imagesy($source);

$max_width = 200;
$max_height = 200;

if ($s_width > $max_width
	|| $s_height > $max_height)
{
	$s_rate = $s_width / $s_height;
	$t_rate = $max_width / $max_height;

	if ($s_rate > $t_rate)
	{
		$t_width = $max_width;
		$t_height = floor($t_width / $s_rate);
	}
	else
	{
		$t_height = $max_height;
		$t_width = floor($t_height * $s_rate);
	}

	$target = imagecreatetruecolor($t_width,
		$t_height);
	imagecopyresampled($target, $source, 0, 0, 0, 0,
		$t_width, $t_height,
		$s_width, $s_height);
}
else
{
	$target = $source;
}

ob_start();
imagejpeg($target);
$image_data = ob_get_clean(); // 图像数据
imagedestroy($source);
imagedestroy($target);

上述代码实现图片等比压缩,如果是缩放到固定高宽则只需要直接设置为最终高宽。

解析中文域名并配置 Nginx 服务器

部署中文域名站点,下面讲诉设置中文域名站点——“郝越.我爱你”。

设置域名解析

第一步是在设置域名 A 记录,使主机记录中的 @ 和 www 都指向一个 ip。

域名解析

上图为万网域名解析后台解析设置

设置 Nginx server_name

第二步是修改 nginx/conf/nginx.conf 或者其他 vhost 文件,在 server_name 这一行调整为经过 idn_to_ascii 函数编码的中文域名,而不是原始的中文域名。

server {
		listen       80;
		server_name  xn--vq3al9d.xn--6qq986b3xl;
		index index.php;
		root /alidata/www/love;
}

“郝越.我爱你”经过编码之后是“xn--vq3al9d.xn--6qq986b3xl”。

在百度搜索“中文域名编码”,进入在线编码的网站,提交中文域名,即可将中文域名转为 punycode 或者是 GBK 编码。在 nginx 配置文件中使用 punycode 即可。

设置完成之后 reload nginx,即可访问中文域名。

访问中文域名

在浏览器地址栏看到的虽然是中文域名,但实际的链接是 http://xn--vq3al9d.xn--6qq986b3xl 。通过 JavaScript document.domain 获取到的域名也是 “xn--vq3al9d.xn--6qq986b3xl”,两者其实是同一个,通过任何一个地址都能访问到服务器。

扩展:使用 PHP 进行中文域名编码

使用 PHP 进行中文域名编码

国际化域名。

比如中文域名,在浏览器地址栏以中文显示,但实际是以 punycode 进行解析和访问。服务器设置 server_name 时不能直接设置中文域名,而是设置中文域名对应的 punycode。

PHP 提供的 IDN 函数可以把非英文域名转换为 punycode,详见 PHP IDN Functions

idn_to_ascii 将域名转换为 IDNA ASCII 编码
idn_to_unicode idn_to_utf8 别名
idn_to_utf8 将域名 从 ASCII 编码转换为 Unicode 编码

代码示例

$xn_idn = idn_to_ascii('郝越.我爱你');
echo $xn_idn; // xn--vq3al9d.xn--6qq986b3xl

$idn = idn_to_utf8($xn_idn);
echo $idn; // 郝越.我爱你

使用 IDN 函数之前需要先安装 php5-intl 扩展:

sudo apt-get install php5-intl

PHP Socket 实现 TCP、UDP 报文的发送与接收

利用 PHP Socket 相关函数实现 TCP、UDP 端口监听。

需要注意,下面的示例代码中没有处理 Socket 错误。实际应用场景中每一步 Socket 的连接、写入、读取都需要进行错误判断和处理,相应的函数 socket_connect、socket_write、socket_read 以及 socket_bind、socket_listen 返回 false 时,需要调用 socket_last_error() 获取最新的 socket 错误号 $errno,并通过 socket_strerror($errno) 获取错误号对应的能够阅读的错误描述信息。

PHP Socket TCP 发送数据示例

$host = '127.0.0.1';
$port = '81';
$message = 'Hello TCP Server';

function send_tcp_message($host, $port, $message)
{
	$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
	@socket_connect($socket, $host, $port);

	$num = 0;
	$length = strlen($message);
	do
	{
		$buffer = substr($message, $num);
		$ret = @socket_write($socket, $buffer);
		$num += $ret;
	} while ($num < $length);

	$ret = '';
	do
	{
		$buffer = @socket_read($socket, 1024, PHP_BINARY_READ);
		$ret .= $buffer;
	} while (strlen($buffer) == 1024);

	socket_close($socket);

	return $ret;
}

$ret = send_tcp_message($host, $port, $message);

PHP Socket TCP 接收数据示例

创建一个 Server 接收 TCP 连接,需要先监听一个端口。

$host = '127.0.0.1';
$port = '81';
$callback = 'echo';

function receive_tcp_message($host, $port, $callback)
{
	$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

	// socket_bind() 的参数 $host 必传, 由于是监听本机, 此处可以固定写本机地址
	// 注意: 监听本机地址和内网地址效果不一样
	@socket_bind($socket, $host, $port);
	@set_time_limit(0);

	// 绑定端口之后调用监听函数, 实现端口监听
	@socket_listen($socket, 5);

	// 接下来只需要一直读取, 检查是否有来源连接即可, 如果有, 则会得到一个新的 socket 资源
	while ($child = @socket_accept($socket))
	{
		// 休息 1 ms, 也可以不用休息
		usleep(1000);

		if (false === socket_getpeername($child, $remote_host, $remote_port))
		{
			@socket_close($child);
			continue;
		}

		// 读取请求数据
		// 例如是 http 报文, 则解析 http 报文
		$request = '';
		do
		{
			$buffer = @socket_read($child, 1024, PHP_BINARY_READ);
			if (false === $buffer)
			{
				@socket_close($child);
				continue 2;
			}
			$request .= $buffer;
		} while (strlen($buffer) == 1024);

		// 此处省略如何调用 $callback
		$response = $callback($remote_host, $remote_port, $request);

		if (!strlen($response))
		{
			// 至少返回含有一个空格的字符串
			$response = ' ';
		}

		// 因为是 TCP 链接, 需要返回给客户端处理数据
		$num = 0;
		$length = strlen($response);
		do
		{
			$buffer = substr($response, $num);
			$ret = @socket_write($child, $buffer);
			$num += $ret;
		} while ($num < $length);

		// 关闭 socket 资源, 继续循环
		@socket_close($child);
	}
}

// 客户端来的任何请求都会打印到屏幕上
receive_tcp_message($host, $port, $callback);
// 如果程序没有出现异常,该进程会一直存在

有一个快捷的函数 socket_create_listen($port),创建、绑定、监听一步到位。

PHP Socket UDP 发送数据示例

$host = '127.0.0.1';
$port = '82';
$message = 'Hello UDP Server';

function send_udp_message($host, $port, $message)
{
	$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
	@socket_connect($socket, $host, $port);

	$num = 0;
	$length = strlen($message);
	do
	{
		$buffer = substr($message, $num);
		$ret = @socket_write($socket, $buffer);
		$num += $ret;
	} while ($num < $length);

	socket_close($socket);

	// UDP 是一种无链接的传输层协议, 不需要也无法获取返回消息
	return true;
}

send_udp_message($host, $port, $message);

PHP Socket UDP 接收数据示例

$host = '127.0.0.1';
$port = '82';
$callback = 'echo';

function receive_udp_message($host, $port, $callback)
{
	$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);

	@socket_bind($socket, $host, $port);
	@set_time_limit(0);

	while (true)
	{
		usleep(1000);

		$ret = @socket_recvfrom($socket, $request, 16384, 0, $remote_host, $remote_port);
		if ($ret)
		{
			$callback($remote_host, $remote_port, $request);
		}

		// 不需要返回给客户端任何消息, 继续循环
	}
}

// 客户端来的任何请求都会打印到屏幕上
receive_udp_message($host, $port, $callback);
// 如果程序没有出现异常,该进程会一直存在

PHP Socket 相关函数

  1. socket_accept — Accepts a connection on a socket
  2. socket_bind — Binds a name to a socket
  3. socket_clear_error — Clears the error on the socket or the last error code
  4. socket_close — Closes a socket resource
  5. socket_cmsg_space — Calculate message buffer size
  6. socket_connect — Initiates a connection on a socket
  7. socket_create_listen — Opens a socket on port to accept connections
  8. socket_create_pair — Creates a pair of indistinguishable sockets and stores them in an array
  9. socket_create — Create a socket (endpoint for communication)
  10. socket_get_option — Gets socket options for the socket
  11. socket_getpeername — Queries the remote side of the given socket which may either result in host/port or in a Unix filesystem path, dependent on its type
  12. socket_getsockname — Queries the local side of the given socket which may either result in host/port or in a Unix filesystem path, dependent on its type
  13. socket_import_stream — Import a stream
  14. socket_last_error — Returns the last error on the socket
  15. socket_listen — Listens for a connection on a socket
  16. socket_read — Reads a maximum of length bytes from a socket
  17. socket_recv — Receives data from a connected socket
  18. socket_recvfrom — Receives data from a socket whether or not it is connection-oriented
  19. socket_recvmsg — Read a message
  20. socket_select — Runs the select() system call on the given arrays of sockets with a specified timeout
  21. socket_send — Sends data to a connected socket
  22. socket_sendmsg — Send a message
  23. socket_sendto — Sends a message to a socket, whether it is connected or not
  24. socket_set_block — Sets blocking mode on a socket resource
  25. socket_set_nonblock — Sets nonblocking mode for file descriptor fd
  26. socket_set_option — Sets socket options for the socket
  27. socket_shutdown — Shuts down a socket for receiving, sending, or both
  28. socket_strerror — Return a string describing a socket error
  29. socket_write — Write to a socket