sskaje / mqtt

MQTT Client class
https://sskaje.me/category/MQTT/
MIT License
86 stars 33 forks source link

WTFFF! (Exception PHP Notice: fwrite(): send of x bytes failed with errno=11 Resource temporarily unavailable in ..ocketClient.php on line 166) [FIX] #21

Open nielsenaa opened 7 years ago

nielsenaa commented 7 years ago

On some environments (encoutered on centos 6 / 7 + php 5.3x /5.4x) , when publishing big content, with any Qos, (for me, it choked on a little bit more over 42kb, Qos2) , you can get a PHP Notice: fwrite(): send of x bytes failed with errno=11 Resource temporarily unavailable in /tmp/mqtt/mqtt/SocketClient.php on line 166 ..

Indeed, it seems that write($packet, $packet_size) in SocketClient.php sometimes returns Null or 0 instead of false or length written.

I know mqtt is not meant for big content, but some printers use the mqtt protocol, and sometimes you need to pass really big files for pdfs or many images. (and i also already had invested too much time into this not solving it)

I modified the write($packet, $packet_size) function in SocketClient.php on line 175 like so :


    /**
     * Send data
     *
     * @param string $packet
     * @param int    $packet_size
     * @return int
     */
    public function write($packet, $packet_size)
    {
        if (!$this->socket || !is_resource($this->socket)) return false;
        Debug::Log(Debug::DEBUG, "socket_write(length={$packet_size})", $packet);

       #add
        do { $packet = substr($packet, fwrite($this->socket, $packet)); } while (!empty($packet));

        If (!empty($packet)) { 
        return false; 
        } else {
        return $packet_size;
        }
       #endadd

      #disabled
      #return fwrite($this->socket, $packet, $packet_size);
    }

It is ugly, but at least now it works flawless (at least for me) . It forces fwrite to do writing correctly, and if not return expected value.

Thanks a thousands to Sskaje who seriously took a lot of personal time debugging my stuff actively and hanging with me for quite a long time and thanks again for his usefull mqtt php library.

sskaje commented 7 years ago

@nielsenaa did you try

mosquitto_pub -h xxx -q 2 -f test.payload -t xxxx 

from your php server?

btw, I'm considering let fwrite() size configurable.

nielsenaa commented 7 years ago

oh we crossposted, sorry ! no i did not, will try and see what it says; what should i pay attention for? Want me to delete the pull request, maybe i was too quick;? I tried stream_set_write_buffer but failed ; is your idea somehow like in the comment that pitched me my patchy solution ? https://stackoverflow.com/questions/13390753/php-stream-write-buffer Many thanks again Sskaje