totalhtml.php (sebuah ironi)

Ada yang sering gagal execute document? Mungkin akar permasalahannya seperti yang akan saya uraikan berikut. Jadi BeBeBe alias Baca Baik-Baik dan Baca Benar-Benar!

Coba buka file totalhtml.php di folder C:\Siakapp\Lib menggunakan editor apa saja yang anda sukai (saya pilih ultraedit).

<?php
function to_pdf($string,$paper,$orientation){
$namafile=$_SESSION['symfony/user/sfUser/attributes']['symfony/user/sfUser/attributes']['ses_siak_user']."-".time(). "-" .rand();
$mytemp = getcwd()."/tmppdf/f" .$namafile . ".html";
$pdf_path="tmppdf/f" .$namafile . ".pdf";
$mytemppdf = getcwd().'/'.$pdf_path;
$article_f = fopen($mytemp,'w');
fwrite($article_f, $string);
fclose($article_f);
unset($string);
$pathExec = '"'.getcwd().'\\htmltopdf.exe" "'.$mytemp.'" "'.$mytemppdf.'" -ps '.$paper.' -po '.$orientation.' -c pdf';
//$pdf=fopen("http://localhost:8082/cetak/pdf.php?exec=".urlencode ($pathExec),"r");
//echo $pathExec;
$WshShell = new COM("WScript.Shell");
$oExec = $WshShell->Exec($pathExec);
$url="cetak/pdf.php?exec=".urlencode ($pathExec)."&pdf=".$mytemppdf."&path=".$pdf_path;
$ukuran_awal=0;
$sama_ukuran=false;
//sleep(2);
while(!$sama_ukuran){
if(file_exists($mytemppdf)){
$ukuran=filesize($mytemppdf);
if($ukuran==0){
sleep(1);
}else{
if($ukuran!=$ukuran_awal){
$ukuran_awal=$ukuran;
sleep(2);
}else
$sama_ukuran=true;
}
clearstatcache();
}
else
sleep(1);
}
//unlink($mytemp);
//$pdfDelete = getcwd().
//unlink($mytemppdf);
//return $url;
return $pdf_path;
}
?>


Bisa menemukan ironinya? Saya tunjukkan di mana letaknya. Perhatikan looping while(!$sama_ukuran). Dari sini kita tahu cara kerja konversi pdf yang dilakukan oleh Siak 2.2, yaitu:




  1. Set variabel (nama file html, nama file pdf, folder penyimpanan hasil konversi dll).


  2. Panggil htmltopdf.exe dengan parameter yang telah disiapkan.


  3. Cek ukuran file pdf yang dihasilkan, bobo sebentar, trus cek lagi ukurannya. Kalo ukuran berubah (asumsinya adalah proses konversi belum selesai) maka bobo lagi, begitu terus sampai ukuran nggak berubah-ubah setelah bobo berkali-kali (hehe) dengan asumsi bahwa proses telah selesai dilakukan.



Kenyataannya sodara-sodara




  1. htmltopdf.exe yang aslinya bernama TotalHtmlConverter : http://www.coolutils.com/TotalHTMLConverter (nggak tahu deh dapat bajakan dimana programmer siak-nya hehe) kadang-kadang error, nggak tahu kenapa. Artinya nggak 100% semua konversi berhasil dilakukan. Kadang-kadang dia langsung error dan berhenti prosesnya, atau nggak berhenti-berhenti prosesnya dan ngabisin resource CPU (bisa dilihat di Task Manager), jadi harus dimatikan paksa lewat Task Manager.


  2. Mungkin nggak looping sudah keluar padahal file pdf belum selesai terkonversi? Mungkin saja!


  3. Kenapa nggak pake fungsi exec() yang notabene nungguin sampai htmltopdf.exe kelar baru lanjut ke baris kode selanjutnya? Jawabannya baca kenyataan no 1!



Intinya sodara-sodara




1. Bisa nggak htmltopdf.exe nggak sampai ngabisin resource CPU?



2. Bisa nggak looping hanya keluar kalo pdf sudah benar-benar lengkap?




Saya tidak tahu solusi yang anda ambil apa tapi kalau saya pengennya:




1. Nggak ada looping-looping-an (jadi inget dosen pemrograman grafis saya, cuma buat nunjukkin step-step penggambaran dia pake looping for i:=1 to 1000000 di setiap step, alhasil programnya sih jadi sesuai tujuan dia tapi resource CPUne entek program lainnya matek! Haduh ini dosen sekolah dimana yak?



2. Batasi waktu htmltopdf.exe. Jadi berhasil nggak berhasil htmltopdf.exe harus matek, kalo nggak bisa bahaya buat aplikasi yang lain.




Akhirnya buat aplikasi tambahan. Lihat kode totalhtml.php saya:



<?php
function to_pdf($string,$paper,$orientation){
$namafile=$_SESSION['symfony/user/sfUser/attributes']['symfony/user/sfUser/attributes']['ses_siak_user']."-".time(). "-" .rand();
$mytemp = getcwd()."/tmppdf/f" .$namafile . ".html";
$pdf_path="tmppdf/f" .$namafile . ".pdf";
$mytemppdf = getcwd().'/'.$pdf_path;
$article_f = fopen($mytemp,'w');
fwrite($article_f, $string);
unset($string);
fclose($article_f);

$pathExec = '"'.getcwd().'\\siHeHe.exe" '.$mytemp.' '.$mytemppdf.' '.$paper.' '.$orientation;
exec($pathExec);

return $pdf_path;
}
?>


Aplikasinya saya namakan siHeHe alias simple Htmltopdf Helper. Nah cara kerjanya adalah sebagai berikut:




SiakApp –> siHeHe –> htmltopdf.exe





  1. SiakApp memanggil totalhtml.php yang kemudian mengeksekusi dan menunggu siHeHe sampai selesai.


  2. siHeHe memanggil htmltopdf.exe dan menunggunya sampai selesai.


  3. Jika dalam 5 (lima) menit htmltopdf.exe tidak juga menyelesaikan tugasnya maka reshuffle dilakukan (bercanda! maksud saya htmltopdf.exe akan diberhentikan paksa alias dengan tidak hormat).



Jika ingin menggunakan siHeHe, download di sini : http://ifile.it/dzp5j3m/siHeHe.rar. Ekstrak ke folder C:\SiakApp\web lalu ubah file totalhtml.php seperti di atas. Perhatikan bahwa siHeHe sebagaimana juga siTeBe hanya dapat digunakan sampai 31 Desember 2011. Mengapa? Karena saya membutuhkan saran untuk pengembangan lebih lanjut serta bug fixing jika ada bug. Jadi, gunakan aplikasi saya dan kasih komentar di blog ini! Jadi saya tahu itu aplikasi berguna atau tidak! Wassalamu’alaikum :)



Update 25 Oktober 2011 :



Bagi yang bermasalah dengan implementasi siHeHe, mungkin PHPnya bermasalah! Mungkin lho saudara-saudara, saya juga tidak bisa memastikan lha wong di Wonogiri baik-baik saja tuh. Solusinya coba pake PHP saya, siapa tahu memang di PHP masalahnya. Download di sini: http://ifile.it/jxdokir/php5.rar

5 Responses so far.

  1. Anonymous says:

    If a program is started with this function, in order for it to continue running in the background, the output of the program must be redirected to a file or another output stream. Failing to do so will cause PHP to hang until the execution of the program ends.
    Intinya exec menyebabkan program hang. Apabila proses satu belum selesai tapi sudah dilakukan exec yang sama.https://bugs.php.net/bug.php?id=44994

  2. ADB Kab. Jepara says:

    Setelah dicoba, memang ditemukan permasalahan baru, pada awalnya script berjalan lancar untuk proses generate pdf cepat (pake bgt) :), akan tetapi setelah beberapa user mengakses generate pdf bersama terjadi penumpukan antrian proses SiHeHe di Task Manager dan berakibat layar blank di client, bisa diatasi dengan restart Apachenya lagi,seandainya dilogikakan sihehe apabila sudah 3 menit(asumsi lama) tidak berjalan maka bisa secara otomatis membunuh dirinya sendiri, ini hanya pendapat/asumsi, Salam Sukses

  3. amanyauna says:

    @Anonymous : Bug #44994 itu hubungannya dengan program non-interaktif padahal siHeHe bukan program non-interaktif, jadi point anda apa?

    Lihat bug #30794 : Ini bukan bug, exec() memang nunggu sampai siHeHe selesai, bukankah itu yang kita mau

    @Adb Jepara : mungkin PHP anda bermasalah coba download PHP saya. Kembali ke atas dan temukan link untuk mendownload PHP saya!

  4. Anonymous says:

    info ini sdh kadar luarsa....
    pengunjung harap hati-hati info sesaat
    yg memungkinkan berdampak negatif thdp operasional aplikasi yg telah dan akan digunakan

  5. SIAK adalah program serius bukan cuma program untuk belajar dan coba2. Saya sangat menyesal sekali membaca blog ini. Program sepenting dan sekrusial itu bisa dibuka2 dan dicoba2 adalah hal konyol dan memalulan.

Leave a Reply