Я стал любопытным и проверил ссылку Adam Backstrom на [1 110] Технология Ваша Вселенная . Эта статья описывает одну из причин, которые требуют, должен использоваться вместо require_once. Однако их требования не содержали до моего анализа. Я интересовался бы наблюдением, где я, возможно, ошибочно анализировал решение. Я использовал php 5.2.0 для сравнений.
я начал путем создания 100 заголовочных файлов, которые использовали require_once для включения другого заголовочного файла. Каждый из этих файлов смотрел что-то как:
я создал их с помощью быстрого взлома удара:
for i in /home/fbarnes/phpperf/hdr{00..99}.php; do
echo " $i
cat helper.php >> $i;
done
Этот путь я мог легко подкачать между использованием require_once и потребовать когда включая заголовочные файлы. Я тогда создал app.php для загрузки этих ста файлов. Это было похоже:
я контрастировал, require_once заголовки с требуют заголовков, которые использовали сходство с заголовочного файла:
я не нашел много различия, когда выполнение этого с требует по сравнению с require_once. На самом деле мои начальные тесты, казалось, подразумевали, что require_once был немного быстрее, но я не обязательно верю этому. Я повторил эксперимент с 10 000 входных файлов. Здесь я действительно видел последовательное различие. Я запустил тест многократно, результаты близки, но использующий require_once использует в среднем 30,8 пользовательского мига и 72,6 системного мига; использование требует использования в среднем 39,4 пользовательского мига и 72,0 системного мига. Поэтому кажется, что загрузка немного ниже использует require_once. Однако настенные часы немного увеличены. 10 000 вызовов require_once используют 10,15 секунд для завершения в среднем, и 10,000 требуют, чтобы вызовы использовали 9,84 секунд в среднем.
Следующий шаг должен изучить эти различия. Я использовал strace для анализа системных вызовов, которые делаются.
Прежде, чем открыть файл от require_once следующие системные вызовы сделаны:
time(NULL) = 1223772434
lstat64("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat64("/home/fbarnes", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat64("/home/fbarnes/phpperf", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat64("/home/fbarnes/phpperf/h", {st_mode=S_IFDIR|0755, st_size=270336, ...}) = 0
lstat64("/home/fbarnes/phpperf/h/hdr0.php", {st_mode=S_IFREG|0644, st_size=88, ...}) = 0
time(NULL) = 1223772434
open("/home/fbarnes/phpperf/h/hdr0.php", O_RDONLY) = 3
Это контрастирует с, потребуйте:
time(NULL) = 1223772905
lstat64("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat64("/home/fbarnes", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat64("/home/fbarnes/phpperf", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat64("/home/fbarnes/phpperf/h", {st_mode=S_IFDIR|0755, st_size=270336, ...}) = 0
lstat64("/home/fbarnes/phpperf/h/hdr0.php", {st_mode=S_IFREG|0644, st_size=146, ...}) = 0
time(NULL) = 1223772905
open("/home/fbarnes/phpperf/h/hdr0.php", O_RDONLY) = 3
Технология Ваша Вселенная подразумевает, что require_once должен выполнить больше lstat64 вызовов. Однако они оба делают то же количество вызовов lstat64. Возможно, различие - то, что я не выполняю APC для оптимизации кода выше. Однако следующая вещь, которую я сделал, была, сравнивают вывод strace для всех выполнений:
[fbarnes@myhost phpperf]$ wc -l strace_1000r.out strace_1000ro.out
190709 strace_1000r.out
210707 strace_1000ro.out
401416 total
Эффективно существует еще приблизительно два системных вызова на заголовочный файл при использовании require_once. Одно различие - то, что require_once имеет дополнительный вызов ко времени () функция:
[fbarnes@myhost phpperf]$ grep -c time strace_1000r.out strace_1000ro.out
strace_1000r.out:20009
strace_1000ro.out:30008
другой системный вызов является getcwd ():
[fbarnes@myhost phpperf]$ grep -c getcwd strace_1000r.out strace_1000ro.out
strace_1000r.out:5
strace_1000ro.out:10004
Это называют, потому что я решил к относительному пути, на который ссылаются в hdrXXX файлах. Если я делаю это абсолютной ссылкой, то единственной разницей является дополнительное время (ПУСТОЙ) вызов, выполненный в коде:
[fbarnes@myhost phpperf]$ wc -l strace_1000r.out strace_1000ro.out
190705 strace_1000r.out
200705 strace_1000ro.out
391410 total
[fbarnes@myhost phpperf]$ grep -c time strace_1000r.out strace_1000ro.out
strace_1000r.out:20008
strace_1000ro.out:30008
Это, кажется, подразумевает, что Вы могли сократить количество системных вызовов при помощи полных путей, а не относительных путей. Единственной разницей за пределами этого является время (ПУСТЫЕ) вызовы, которые, кажется, используются для того, чтобы оснастить код для сравнения то, что быстрее.
Еще одно примечание - то, что пакет оптимизации APC имеет опцию, названную "apc.include_once_override", который утверждает, что это сокращает количество системных вызовов, сделанных require_once и вызовами include_once (см. документы PHP ).
Извините за длинное сообщение. Я стал любопытным.
Хорошо, вот как я это сделал. Сначала apilinks.py
(расширение Sphinx):
from docutils import nodes, utils
def setup(app):
def api_link_role(role, rawtext, text, lineno, inliner, options={},
content=[]):
ref = app.config.apilinks_base + text
node = nodes.reference(rawtext, utils.unescape(ref), refuri=ref,
**options)
return [node], []
app.add_config_value('apilinks_base', 'http://localhost/', False)
app.add_role('apilink', api_link_role)
Теперь в conf.py
добавьте 'apilinks'
в список расширений и установите соответствующее значение для 'apilinks_base'
(в противном случае по умолчанию будет 'http: // localhost /'
). Мой файл выглядит так:
extensions = ['sphinx.ext.autodoc', 'apilinks']
# lots of other stuff
apilinks_base = 'http://host:88/base/'
Использование:
:apilink:`path`
Вывод:
<a href="http://host:88/base/path">http://host:88/base/path</a>
Вы можете написать Sphinx расширение , которое создает роль , например
:apilink:`path`
, и генерирует ссылку из нее. Я никогда этого не делал, поэтому ничем не могу помочь, кроме как указать этот указатель, извините. Вы должны попытаться посмотреть, как реализованы различные роли. Думаю, многие из них очень похожи на то, что вам нужно.