Di tulisan ini saya telah menulis bagaimana memanggil API odoo dengan menggunakan library ripcord pada bahasa pemrograman PHP. Ternyata library ini memiliki beberapa bug, terutama jika proses pemanggilan API sangat lama.
Dalam kasus yang saya alami, saya harus mengirim data yang cukup besar ke server odoo, dimana proses pengolahan data membutuhkan waktu lebih dari 3 menit. Data berhasil diterima dan diproses oleh odoo, tetapi kode PHP saya tidak mendapat respon dari server odoo, malah menampilkan error seperti pada gambar di bawah ini.
Ternyata error ini terjadi karena kode ripcord sudah menyebabkan timeout, sedangkan pengolahan data di server odoo masih berjalan. Ripcord sendiri tidak mengatur berapa lama timeout akan terjadi. Oleh karena itu, untuk mengatasi masalah ini kita harus mengubah file ripcord_client.php untuk mengatur lama timeout.
Perhatikan kode mulai baris ke 464 di file ripcord_client.php berikut ini.
/** * This method posts the request to the given url. * @param string $url The url to post to. * @param string $request The request to post. * @return string The server response * @throws Ripcord_TransportException (ripcord::cannotAccessURL) when the given URL cannot be accessed for any reason. */ public function post( $url, $request ) { $options = array_merge( $this->options, array( 'http' => array( 'method' => "POST", 'header' => "Content-Type: text/xml", 'content' => $request ) ) ); $context = stream_context_create( $options ); $result = @file_get_contents( $url, false, $context ); $this->responseHeaders = $http_response_header; if ( !$result ) { throw new Ripcord_TransportException( 'Could not access ' . $url, ripcord::cannotAccessURL ); } return $result; }
Untuk menambahkan pengaturan timeout kita bisa mengubah kode di atas menjadi seperti di bawah ini.
/** * This method posts the request to the given url. * @param string $url The url to post to. * @param string $request The request to post. * @return string The server response * @throws Ripcord_TransportException (ripcord::cannotAccessURL) when the given URL cannot be accessed for any reason. */ public function post( $url, $request ) { $options = array_merge( $this->options, array( 'http' => array( 'method' => "POST", 'header' => "Content-Type: text/xml", 'content' => $request, 'timeout' => 3600, // tambah timeout agar tidak error could not access ip_odoo ) ) ); $context = stream_context_create( $options ); $result = @file_get_contents( $url, false, $context ); $this->responseHeaders = $http_response_header; if ( !$result ) { throw new Ripcord_TransportException( 'Could not access ' . $url, ripcord::cannotAccessURL ); } return $result; }
Setelah ditambahkan timeout apakah sudah bisa berjalan lancar ? Ternyata tidak, error could not access ip_odoo seperti pada gambar di atas sudah tidak tampil, tapi malah menimbulkan error lagi, sekarang halaman jadi blank, tidak menampilkan apa-apa.
Penyebabnya adalah kode di bawah ini.
$result = @file_get_contents( $url, false, $context );
Karena fungsi file_get_contents diawali dengan simbol @, semua pesan error yang disebabkan oleh fungsi file_get_contents tidak akan ditampilkan oleh PHP. Oleh karena itu hasilnya blank. Ok. Sekarang mari kita hapus simbol @ tersebut, sehingga terlihat seperti di bawah ini.
/** * This method posts the request to the given url. * @param string $url The url to post to. * @param string $request The request to post. * @return string The server response * @throws Ripcord_TransportException (ripcord::cannotAccessURL) when the given URL cannot be accessed for any reason. */ public function post( $url, $request ) { $options = array_merge( $this->options, array( 'http' => array( 'method' => "POST", 'header' => "Content-Type: text/xml", 'content' => $request, 'timeout' => 3600, // tambah timeout agar tidak error could not access ip_odoo ) ) ); $context = stream_context_create( $options ); $result = file_get_contents( $url, false, $context ); $this->responseHeaders = $http_response_header; if ( !$result ) { throw new Ripcord_TransportException( 'Could not access ' . $url, ripcord::cannotAccessURL ); } return $result; }
Sekarang hasilnya sudah tidak blank lagi, tapi muncul error seperti pada gambar di bawah ini.
Ternyata proses dari fungsi file_get_contents terlalu lama, dan waktunya sudah melebihi batas yang ditentukan oleh PHP. Tapi tenang, kita bisa mengubah batas Maximum execution time yang hanya 120 detik ini. Kita bisa mengubahnya lewat konfigurasi di file php.ini atau di kodingan langsung. Saya lebih memilih untuk mengaturnya di file kodingan, sehingga saya dapat mengubah kode dari file ripcord_client.php di atas menjadi seperti di bawah ini.
/** * This method posts the request to the given url. * @param string $url The url to post to. * @param string $request The request to post. * @return string The server response * @throws Ripcord_TransportException (ripcord::cannotAccessURL) when the given URL cannot be accessed for any reason. */ public function post( $url, $request ) { $options = array_merge( $this->options, array( 'http' => array( 'method' => "POST", 'header' => "Content-Type: text/xml", 'content' => $request, 'timeout' => 3600, // tambah timeout agar tidak error could not access ip_odoo ) ) ); set_time_limit(3600); // perbesar limit, untuk mencegah error maximum execution time $context = stream_context_create( $options ); $result = file_get_contents( $url, false, $context ); $this->responseHeaders = $http_response_header; if ( !$result ) { throw new Ripcord_TransportException( 'Could not access ' . $url, ripcord::cannotAccessURL ); } return $result; }
Sekarang ripcord sudah bisa mengirim data besar dan membutuhkan waktu lama untuk diproses ke odoo. Ingat pengaturan timeout dan maximum execution time di atas nilainya dalam detik.
Semoga tulisan ini berguna bagi anda.