2012-04-01 28 views
5

Một vấn đề tôi khám phá ra hôm nay tương tự như điều này unanswered problem; mặc dù không giống nhau, nó có thể có cùng một nguyên nhân.Inkscape bên trong PHP/Apache không hiển thị phông chữ cho PNG

Tôi đang hiển thị tệp SVG bằng cách sử dụng inkscape, dưới dạng PNG hoặc PDF. Đối với hầu hết các phần, tôi có ý định sử dụng Gearman để hiển thị chúng trong nền, nhưng bây giờ tôi đang tạo một số hình thu nhỏ bên trong một tiến trình PHP/Apache. Có vẻ như nếu inkscape được gọi (thông qua PHP exec) bên trong một quá trình Apache, nó không thể tìm thấy các phông chữ nó cần để render. Do đó, các yếu tố đồ họa hiển thị tốt, nhưng bất kỳ yếu tố văn bản nào không được vẽ trong đầu ra PNG.

Tôi nghi ngờ rằng môi trường CLI từ bên trong Apache khác với giao diện điều khiển bash thông thường của tôi theo cách có nghĩa là không thể nhìn thấy phông chữ. Tôi đang sử dụng OS X 10.6.8. Ý tưởng nào?

Chỉnh sửa: theo dõi từ nhận xét, tôi đã chụp php -i bên trong cả Apache và Gearman, và phân biệt đối số đầu tiên với thứ hai (do đó, trong lý thuyết áp dụng diff sẽ làm cho nó hoạt động). result is here.

Chỉnh sửa 2: Tôi đã thử convert -list font trong cả hai môi trường sử dụng system - không có sự khác biệt nào cả.

+0

Tôi đã giải quyết vấn đề này bằng cách sử dụng tác vụ có mức độ ưu tiên cao trong Gearman, đó là giải pháp ưa thích của tôi - vì nó sẽ giúp tôi giữ một số nắp về quá trình inkscape đồng thời. Nhưng tôi vẫn nghĩ rằng câu hỏi này là rất quan tâm, vì vậy sẽ khuyến khích bất cứ ai có ý tưởng để gửi 'em! Tiền thưởng sắp tới khi máy cho phép tôi. – halfer

+0

(Bỏ qua lời giới thiệu - Tôi đã làm phiền rõ ràng anon_coward, người đã downvoted một số bài viết không liên quan của tôi!) – halfer

+0

+1, nghe có vẻ thú vị và không có gì sai với câu hỏi :) – kontur

Trả lời

3

Như đã xác định trong các ý kiến ​​ở trên, điều này đã gây ra bởi một sự khác biệt về môi trường - var HOME env được thành lập cách khác nhau bên trong quá trình thực hiện. Sử dụng proc_open thay vì đơn giản exec kiểm soát chính xác hơn quy trình đã nêu và thiết lập rõ ràng rằng env var đã giải quyết được vấn đề.

+0

'exec (" HOME =/path/to/home/usr/bin/inkscape ")' cũng hoạt động. Tôi tự hỏi tại sao phông chữ hệ thống không làm việc với nhà unset mặc dù. – qwazix

1

Đối với hồ sơ, đây là việc sử dụng proc_open đã giúp khắc phục vấn đề này:

$command = "{$exec} --without-gui {$params} {$file} {$redirect}"; 
$return = -1; 
// Comment this out for now 
//exec($command, self::$output, $return); 

$descriptorspec = array(
    0 => array("pipe", "r"), 
    1 => array("pipe", "w"), 
    2 => array("file", "/dev/null", "a") 
); 
$pipes = array(); 
$env = array(
    // Try additional stuff here, but culprit was: 
    'HOME' => '/Users/jon', 
); 
$resource = proc_open(
    $command, 
    $descriptorspec, 
    $pipes, 
    $cwd = null, 
    $env 
); 
+0

Cảm ơn bạn đã chia sẻ phần này. Chỉ cần một quan sát thêm: là các đối số trong lệnh đúng escaped ('escapeshellargs')? – DCoder

+0

Thực ra, tôi chưa có; câu hỏi hay. Tôi có nên sử dụng điều đó mặc dù tôi không lấy bất kỳ đối số nào từ đầu vào của người dùng không? – halfer

+0

Tôi chạy tất cả các đối số thông qua nó trong thói quen.Nếu bạn không sử dụng bất kỳ đầu vào người dùng nào (tên tệp của bạn được tự động phát hiện và chắc chắn không chứa nội dung không giống như dấu cách), bạn có thể an toàn như nó. – DCoder

Các vấn đề liên quan