Проблема в том, что у меня в /etc/profile прописано много локалей, необходимых для работы переводчика. Так вот. При логине в шелле под root или www (для обоих пользователей у меня прописаны все права и шелл bash), все прописанные локали поддершиваются. Если я из под шелл запускаю apache: apachectl stop; apachectl start, то локали поддерживаются и для функции exec или system (PHP). Если я перезагружаю apache (apachectl restart) или apache загружается из автозагрузки, то локали перестают работать из под exec или system. Для всех скриптов (автозагрузка, apachectl) прописал вместо #!/bin/sh - #!/usr/local/bin/bash
Всеравно не помогает... Подскажите, плз - как заставить чтобы шелл запущенный через web - также поддерживал необходимые env переменные?
>[оверквотинг удален]
>для работы переводчика. Так вот. При логине в шелле под root
>или www (для обоих пользователей у меня прописаны все права и
>шелл bash), все прописанные локали поддершиваются. Если я из под шелл
>запускаю apache: apachectl stop; apachectl start, то локали поддерживаются и для
>функции exec или system (PHP). Если я перезагружаю apache (apachectl restart)
>или apache загружается из автозагрузки, то локали перестают работать из под
>exec или system. Для всех скриптов (автозагрузка, apachectl) прописал вместо #!/bin/sh
>- #!/usr/local/bin/bash
>Всеравно не помогает... Подскажите, плз - как заставить чтобы шелл запущенный через
>web - также поддерживал необходимые env переменные?Вы в httpd.conf прописывать переменные окружения не пробовали?
>[оверквотинг удален]
>>шелл bash), все прописанные локали поддершиваются. Если я из под шелл
>>запускаю apache: apachectl stop; apachectl start, то локали поддерживаются и для
>>функции exec или system (PHP). Если я перезагружаю apache (apachectl restart)
>>или apache загружается из автозагрузки, то локали перестают работать из под
>>exec или system. Для всех скриптов (автозагрузка, apachectl) прописал вместо #!/bin/sh
>>- #!/usr/local/bin/bash
>>Всеравно не помогает... Подскажите, плз - как заставить чтобы шелл запущенный через
>>web - также поддерживал необходимые env переменные?
>
>Вы в httpd.conf прописывать переменные окружения не пробовали?Спасибо! Наконец-то заработало, я щщаслив, спасибо! :-)
>[оверквотинг удален]
>>>функции exec или system (PHP). Если я перезагружаю apache (apachectl restart)
>>>или apache загружается из автозагрузки, то локали перестают работать из под
>>>exec или system. Для всех скриптов (автозагрузка, apachectl) прописал вместо #!/bin/sh
>>>- #!/usr/local/bin/bash
>>>Всеравно не помогает... Подскажите, плз - как заставить чтобы шелл запущенный через
>>>web - также поддерживал необходимые env переменные?
>>
>>Вы в httpd.conf прописывать переменные окружения не пробовали?
>
>Спасибо! Наконец-то заработало, я щщаслив, спасибо! :-)Неа, показалось, всеравно не работает!
Завтра такуюже новую тему открою :-(
Зачем такой изврат? Установкой Env из под апача конечно можно добится того что вам надо, но зачем? Сдается мне вы двигаетесь в очень неправильном направлении, может еще не поздно остановится и сделать все по уму?
>Зачем такой изврат? Установкой Env из под апача конечно можно добится того
>что вам надо, но зачем? Сдается мне вы двигаетесь в очень
>неправильном направлении, может еще не поздно остановится и сделать все по
>уму?Вот я собственно и спрашиваю - как по уму сделать?
>>Зачем такой изврат? Установкой Env из под апача конечно можно добится того
>>что вам надо, но зачем? Сдается мне вы двигаетесь в очень
>>неправильном направлении, может еще не поздно остановится и сделать все по
>>уму?
>
>Вот я собственно и спрашиваю - как по уму сделать?В php/perl скриптах можно устанавлмвать локаль. В perl - setlocale. В php - не помню..
>>>Зачем такой изврат? Установкой Env из под апача конечно можно добится того
>>>что вам надо, но зачем? Сдается мне вы двигаетесь в очень
>>>неправильном направлении, может еще не поздно остановится и сделать все по
>>>уму?
>>
>>Вот я собственно и спрашиваю - как по уму сделать?
>
>В php/perl скриптах можно устанавлмвать локаль. В perl - setlocale. В php
>- не помню..Дело в том, что у меня много локалей - и эти локали нужны не для php, а для того чтобы шелл понимал язык.
>Вот я собственно и спрашиваю - как по уму сделать?Тогда сформулируйте изначальную задачу. То есть для какой цели вы хотите менять локаль, что вы берете из локали, почему без смены локали скрипты не работают.
>>Вот я собственно и спрашиваю - как по уму сделать?
>
>Тогда сформулируйте изначальную задачу. То есть для какой цели вы хотите менять
>локаль, что вы берете из локали, почему без смены локали скрипты
>не работают.У меня установлен шелл переаодчик
Он берет из скрипта php (из формы) текст (иероглифы, русские буквы, испанские).
Далее через exec - передает текст в коммандную строку - если шелл локаль не видит - то получаются знаки вопросов, т.е. в переводчик передается все правильно - он понимает utf-8, а при выходе (уже переведенный текст) в знаках вопросов - т.е. он тоже из шелл забирается - а шелл не понимает какая локаль.
Так вот понимает локаль - в первом случае - если я из под рута запускаю апач и не понимает, если апач сам запускается - из автозагрузки.
С юзерами я в первом посте все подробно описал...
отдавайте команду предварив ее export LC_ALL="ваша локаль". Например
exec('export LC_ALL=ru_RU.CP1251; mytranslator ...')
Также вы можете попробовать менять хеш среды. %ENV в перле, в php не помню, посмотрите доку на тему super globals. И наконец зная в какой кодировке идет возврат мы можете просто перекодировать вывод в самом php(при конвертации юникод-однобайтные могут быть проблемы, но если у вас юникод, то нафига все остальные кодировки)
>в какой кодировке идет возврат мы можете просто перекодировать вывод в
>самом phpВывод идет из шелла, который не понимает локаль и выводит вопросы - так что в самом PHP не получится из вопросов что-либо получить.
>(при конвертации юникод-однобайтные могут быть проблемы, но если у вас
>юникод, то нафига все остальные кодировки)Юникод, я его поэтому и взял - но даже юникод не поддерживается шеллом.
Пробовал локали прописывать перед коммандой. Это соувсем не то, проблема в самом экземпляре шелла - который вызывается екзеком и ничего не понимает...
>[оверквотинг удален]
>так что в самом PHP не получится из вопросов что-либо получить.
>
>
>>(при конвертации юникод-однобайтные могут быть проблемы, но если у вас
>>юникод, то нафига все остальные кодировки)
>
>Юникод, я его поэтому и взял - но даже юникод не поддерживается
>шеллом.
>Пробовал локали прописывать перед коммандой. Это соувсем не то, проблема в самом
>экземпляре шелла - который вызывается екзеком и ничего не понимает...Точнее пробовал прописывать как вы сказали: exec('export LC_ALL=ru_RU.CP1251; mytranslator ...') - не помогает.
>Точнее пробовал прописывать как вы сказали: exec('export LC_ALL=ru_RU.CP1251; mytranslator ...') - не помогает.надеюсь вы не буквально так написали, а адаптировали под ваши нужды. export LC_ALL= повзоляет выставить локаль для всех команд запущенных в том же экземпляре шелла, а ; является разделителем комманд в шелле. То есть перводчик должен был получить правильную установку локали.
Давно не работал с php и не помню уже как работает в нем system/exec и как у него вообще с поддержкой unicode. Как вариант можно попробовать
1. перенаправлять вывод переводчика в файл, а потом его читать средствами php
2. перенаправлять вывод переводчика в iconv и указывать из какой кодировки в какую сконвертить