stream_set_blocking让程序无阻塞
stream_set_blocking ($resource, $flag); $flag 取值为0或1
0是非阻塞,1是阻塞
阻塞的意义是什么呢?
某个函数读取一个网络流,当没有未读取字节的时候,程序该怎么办?
是一直等待,直到下一个未读取的字节的出现,还是立即告诉调用者当前没有新内容?
前者是阻塞的,后者是非阻塞的。
阻塞的好处是,排除其它非正常因素,阻塞的是按顺序执行的同步的读取。
借用小说里的说法就是“神刀出鞘,无血不归”。在读到新内容之前,它不会往下走,什么别的事情都不做。
而非阻塞,因为不必等待内容,所以能异步的执行,现在读到读不到都没关系,执行读取操作后立刻就继续往下做别的事情。
如果你不放心,可以过一定的时间再来检查执行的结果。之前我写过一个用popen pclose来让程序并发执行的例子。
当时的遗憾就是调用之后不管,所以没法知道程序是否执行成功了。现在popen之后设定为非阻塞模式,就可以创建一个数组作为任务池。
使用一个while(1)的“死循环”来检查当前任务池中各个任务的状态,有老任务执行完毕时,$status = stream_get_meta_data($resource);
状态值$status['eof']为真,就表示那个任务执行完毕了。我本次实现的程序功能比较单一,只需要知道它执行完毕就可以了。如果你的任务有多种结果,那就继续分析读取到的内容吧。发现有任务执行完毕,从任务池中剔除该任务,如果任务队列中还有未做的任务,就把新任务从队列中移到任务池中执行。
说的比较啰嗦,如果你用过网络蚂蚁或网际快车之类的下载软件,你会发现我讲的这些其实就是它们的工作原理。
ps:多进程异步抓取很爽啊。
分享到:
相关推荐
通过调用stream_set_blocking()函数可以控制流是否阻塞。 - eof:布尔值,指示流是否已经到达文件末尾。对于socket流而言,即使 ***d_bytes 非零,eof 也可能会返回TRUE。 在PHP4.3版本之前,这个函数的功能可以...
- stream_set_blocking():设置流是否阻塞。 - stream_set_timeout():设置流操作的超时时间。 6. 网络连接: - stream_socket_accept():接受一个套接字连接请求。 - stream_socket_recvfrom()、stream_socket...
stream_set_blocking函数允许程序设置流操作为阻塞模式或非阻塞模式,这对于控制程序的执行流程和效率非常关键。 stream_set_timeout函数用于设置流操作的超时限制,防止因网络或其他原因导致的长时间等待。 ...
除了上述方法,还可以通过设置Socket为非阻塞模式,即`stream_set_blocking($fp, false)`,这样在数据未准备好时,`fread()`和`fwrite()`会立即返回,而不是等待。但是,这种方式需要配合其他同步机制(如`select()`...
可以使用`stream_set_blocking`函数来改变流的阻塞状态。 ```php // 设置流为非阻塞模式 stream_set_blocking($fp, 0); ``` #### 总结 `fsockopen`是PHP中一个功能强大的函数,用于创建与远程主机的网络连接。...
对于非阻塞的`fsockopen`,可以在连接时设置超时参数,然后使用`stream_set_blocking`将其设置为非阻塞模式。然而,这种方式在PHP5之前的版本中并不容易实现,因为`stream_set_blocking`函数在PHP5之后才加入。 在...
`stream_set_blocking`函数将socket设置为阻塞模式,这意味着在没有数据可读时会暂停执行,直到有数据到来或超时。`stream_set_timeout`用于设置等待响应的超时时间。收到数据后,程序将打印出服务器返回的响应内容...
PHP可以通过`stream_set_blocking`来设置非阻塞模式,或者使用像ReactPHP这样的事件循环库。 4. **错误处理**:连接中断、数据解析错误等都需要适当的错误处理机制。 5. **数据发送与接收**:客户端通过调用类的...
PHP的`stream_socket_client()`函数可以配合`stream_set_blocking()`设置为非阻塞模式,使得在一个循环中,即使某个连接还在等待响应,其他连接也可以继续尝试建立。这样,可以在一个循环中并发地发起多个请求。 4....
使用`stream_set_blocking()`函数可以改变这种行为,将其设置为非阻塞模式。 2. **PHP中的管道通信实例**: 以下是一个简化的PHP管道通信类`Pipe`的示例,它封装了管道的创建、读写和关闭操作: ```php class ...
使用`stream_socket_client`可以创建一个socket连接,并且可以通过`stream_set_blocking`来设置为非阻塞模式,这样就可以在不阻塞主线程的情况下进行I/O操作,从而模拟出多线程的效果。这种方法更加接近于底层的网络...
stream_set_blocking($fp, true); // 非阻塞模式 stream_set_timeout($fp, 1); // 设置超时 $header = "GET $path HTTP/1.1\r\n"; $header .= "Host: $host\r\n"; $header .= "Connection: close\r\n\r\n"; // ...
例如,`fsockopen`配合`stream_set_blocking`设置非阻塞模式,可以不等待响应就继续执行后面的代码。`cUrl`则可以通过`curl_multi_init`和`curl_multi_exec`进行多路复用,同时发起多个请求并异步处理。 3. **使用...
BIO(Blocking IO)则是传统的同步阻塞模型。 6. **网络编程**:Java提供Socket和ServerSocket类进行TCP/IP通信,DatagramSocket和MulticastSocket支持UDP协议。理解网络编程有助于开发分布式应用。 7. **JVM内存...
- `Blocking`: 设置为`False`,允许非阻塞模式,使服务器能够处理多个并发连接。 3. **启动监听** 使用`sockServer.Listen`方法启动监听,等待客户端的连接请求。监听成功后,会触发`ConnectRequest`事件。 4. *...
如映射(Map)、多值映射(Multimap)、集(Set)、有序集(SortedSet)、计分排序集(ScoredSortedSet)、字典排序集(LexSortedSet)、列表(List)、队列(Queue)、双端队列(Deque)、阻塞队列(Blocking Queue...
设置套接字阻塞的函数被`stream_set_blocking()`替代。 8. **split()系列函数**: 包括`split()`和`spliti()`,用于分割字符串,现在建议使用`preg_split()`函数替代。 9. **sql_regcase()**: 此函数已经过时...
26. `socket_set_blocking`、`socket_set_timeout` 和 `syslog`:分别用于设置socket的阻塞模式、超时时间以及生成系统日志消息。 这些函数构成了PHP进行网络操作的基础工具箱,涵盖了从基本的DNS解析到高级的网络...