Have you considered using proc_open()?