tripcollor
@tripcollor

Как из пакета в composer запустить внешнюю программу которая находится в директории самого пакета?

Я пытаюсь сделать свой composer пакет, на основе плагина в github. Вот он https://github.com/chapagain/php-swiss-ephemeris

Тут есть один нюанс:
php скрипт использует и запускает внешнюю программу Швейцарских Эфемерид в этом плагине на который я опираюсь он находится в папке sweph.

Я хочу сделать свой composer пакет который бы внутри запускал внешнюю программу получал бы у нее данные, дальше шла бы стандартная обработка данных и приведение в тот вид что мне нужен.

У меня сейчас такая структура файлов:

src
--sweph
--Natal.php
vendor
composer.json
index.php

Содержание composer.json:
{
  "name": "tripcollor/astro",
  "description": "PHP library for calculations astro",
  "keywords": [
      "astrology"
  ],
  "authors": [
      {
          "name": "tripcollor",
          "email": "email@yandex.ru"
      }
  ],
  "require": {
      "php": ">=5.6"
  },
  "require-dev": {
  },
  "autoload": {
      "psr-4": {
          "Astrology\\": "src"
      }
  }
}


Я хочу чтобы в index.php можно было подключить use Astrology\Natal и воспользоваться какой либо функцией, а подключаемый файл src/Natal.php в свою очередь должен вызывать внутри себя внешнюю программу которая находится рядом с ним в одной директории в папке sweph. Примерно вот так это должно выглядеть:

Код файла src/Natal.php
<?php

namespace Astrology;

use DateTime;

class Natal
{
  public function test()
  {
    $libPath = './sweph/';
    putenv("PATH=$libPath");
    $birthDate = new DateTime("1990-06-03T13:30:00Z");
    $latitude = 55.5557;
    $longitude = 52.5752;
    $timezone = 0; 
    $timezone * (60 * 60);
    $birthTimestamp = strtotime($birthDate->format('Y-m-d H:i:s'));
    $utcTimestamp = $birthTimestamp - $offset;
    $date = date('d.m.Y', $utcTimestamp);
    $time = date('H:i:s', $utcTimestamp);

    exec ("swetest -edir$libPath -b$date -ut$time -p0123456789ABCDEFGHIJKLMNOPQRSTUVWX -xz  -emos -fPls -g, -head", $output_t);
    
    print_r($output_t);
  }
}


Код файла index.php тут подключаем и используем наш плагин:
<?php 

require './vendor/autoload.php';

use Astrology\Natal;

$Natal= new Natal();
$Natal->test();


Так не работает дело видимо в том, что $libPath = './sweph/'; обращается к этой папке не из файла src/Natal.php как мне нужно, а из файла в котором я его подключаю то есть в Index.php. Что нужно прописать в $libPath что бы все работало как задумано, и чтобы это работало при загрузке пакета в другой проект из composer. Можно конечно вынести папку sweph в корень сайта а здесь передавать путь к ней $Ayurveda->test('./path/sweph/'); относительно файла Index.php для этого примера, но охота в итоге чтобы все выполнялось под капотом. Подскажите пожалуйста.
  • Вопрос задан
  • 96 просмотров
Решения вопроса 1
hOtRush
@hOtRush
Структура не совсем правильная.

- index.php - странный файл для композер пакета. Какую функцию он выполняет?
- Ваша программа не должна быть в папке с исходниками - ее нужно либо переместить в bin, либо подтягивать отдельным пакетом либо вообще просто передавать абсолютный путь к бинарнику в new Ayurveda($binPath)
- Ну и ./swe.. это немного странно, нужно использовать что-то вроде realpath(dirname(__FILE__))
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы