Vorgehen, um zu ermitteln, welche PHP-Extensions ich für meine Applikation benötige

  • PHP

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von Marcus Gräfe.

    Vorgehen, um zu ermitteln, welche PHP-Extensions ich für meine Applikation benötige

    Ich entwickle derzeit eine Software mit PHP 8.0. Auf dem Server, auf dem diese Applikation später laufen wird, läuft sonst nichts anderes, d. h. dort sollen nach Möglichkeit auch nur die wirklich benötigten Extensions installiert werden.

    Habt ihr irgendeine Idee/einen Tipp, wie ich am besten vorgehe, um die Abhängigkeiten zu ermitteln?
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Wenn du die Anwendung geschrieben hast solltest du doch wissen ob du mit Datenbanken, Bildern, curl oder sonst etwas arbeitest?
    Ansonsten einfach alle Extensions deaktivieren, Errorlog öffnen und die Extensions nach und nach aktivieren bis du keine Fehler mehr bekommst?
    Sofern dein Projekt Composer als Paketverwaltung verwendet, kannst du z.b. PHP-Extensions mit angeben.
    Wenn bei einem Release bspw. immer ein composer install stattfinden würde - wirft der Command einen Fehler wenn die entsprechende extension auf dem Host-System nicht installiert ist.

    Quellcode

    1. {
    2. "name": "acr0most/test",
    3. "authors": [
    4. {
    5. "name": "***",
    6. "email": ""***"
    7. }
    8. ],
    9. "require": {
    10. "ext-mongodb": "*"
    11. }
    12. }


    Quellcode

    1. $ composer install
    2. Loading composer repositories with package information
    3. Warning from https://packagist.org: Support for Composer 1 is deprecated and some packages will not be available. You should upgrade to Composer 2. See https://blog.packagist.com/deprecating-composer-1-support/
    4. Updating dependencies (including require-dev)
    5. Your requirements could not be resolved to an installable set of packages.
    6. Problem 1
    7. [b]- The requested PHP extension ext-mongodb * is missing from your system. Install or enable PHP's mongodb extension.[/b]


    Dementsprechend werden deine abhängigen Pakete auch nicht installiert und deine App ist nicht lauffähig. Ist die Frage ob man das möchte..

    PS: Die PHP-Version kannst du darüber auch fest machen. (z.b. 8.0 oder (größer) ^7.4, etc.)

    VG,
    Acr0most
    Wenn das Leben wirklich nur aus Nullen und Einsen besteht, dann laufen sicherlich genügen Nullen frei herum. :D
    Signature-Move 8o
    kein Problem mit privaten Konversationen zu Thema XY :thumbup:
    @slice Natürlich weiß ich, ob ich Datenbanken, Bilder usw. verwende, aber dadurch noch nicht unbedingt, welche Extensions dafür nötig sind. Nun gut, bei den beiden Beispielen ist es noch ziemlich eindeutig, aber es gibt sicher auch welche, da komme ich nicht von selbst drauf. Das mit dem Deaktivieren aller Extensions und dann einfach testen ist natürlich eine Möglichkeit. Ich dachte nur, es gibt evtl. einen eleganteren Weg. ;)

    @Acr0most Composer verwende ich nicht. Da das eine einmalige Installation wird (ein Mal und nur auf einem Server), ist das vmtl. auch nicht nötig. Außerdem muss ich dann ja, wenn ich das richtig verstehe, trotzdem selber wissen, welche Extensions nötig sind und diese angeben.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Educated guess?
    Ich hab bei Github folgendes gefunden: llaville/php-compat-info
    Quote: PHP CompatInfo is a library that can find the minimum version and the extensions required for a piece of code to run.

    Eventuell funktioniert das?

    Edit: End-user Documentation
    Danke, das sieht vielversprechend aus. Ich habe es jetzt auf die Schnelle zwar nicht zum Laufen gebracht, aber ich denke, damit wird es klappen.

    Ich melde mich, wenn ich es getestet habe.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Nachdem ich irgendwann endlich das Konzept von "Composer" verstanden hatte, konnte ich mir "php-compatinfo" auch installieren. Leider habe ich es auch nach Stunden nicht zum Laufen gebracht.

    In der Enduser-Doku wird die PHAR-Version verwendet. Das scheint mir auch wesentlich einfacher zu sein als die "normale" Version. Allerdings gibt es die aktuelle Version nicht als PHAR-Datei (nur eine 2-3 Jahre alte), die müsste man sich selbst kompilieren. Das wiederum schlägt aber auch fehl.

    Man soll sich "box" von github.com/box-project/box laden und dann im php-compatinfo-Verzeichnis php box.phar compile ausführen. Dabei erhalte ich [ERROR] The configuration file is invalid. und "directories" must contain a list of existing directories.. "directories" in der zugehörigen "box.json.dist" enthält das Verzeichnis "vendor". Dies existiert nur nach der Installation von php-compatinfo via Composer (also nicht im Komplettdownload von Github). Aber auch dann liegt das vendor-Verzeichnis nicht dort, wo php-compatinfo liegt. Ändere ich vendor zu ../../../vendor, so kompiliert die PHAR zwar, aber nach Ausführung der generierten PHAR-Datei erhalte ich Fatal error: Uncaught Error: Class "Bartlett\CompatInfoDb\Presentation\Console\ApplicationInterface" not found in phar://C:/wamp64/www/phpcompatinfo/config/bootstrap.php:35.

    Ein Ausführen der via Composer installierten Version geht auch nicht, auch nur Fehlermeldungen.

    Hat jemand auch nur den Hauch einer Idee, wie ich das Ding zum Laufen bringe? Ich verzweifle hier langsam ...

    Ich hatte übrigens noch ein wesentlich simpleres Programm entdeckt, um mein Vorhaben zu realisieren, nämlich den "php-unused-extensions-scanner" von github.com/alexverkeenko/php-unused-extensions-scanner. Allerdings ist die neueste Version über 5 Jahre alt und ist im Prinzip identisch zu einer über 10 Jahre alten Version (die neuere ist ein Fork). Die läuft zwar fehlerfrei durch, zeigt aber an, dass alle Extensions "unused" sind, und das kann unmöglich sein. Vmtl. einfach nicht PHP-8-kompatibel. Somit muss es eigentlich "php-compatinfo" sein. Eine andere Möglichkeit sehe ich leider nicht.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Vorab: Das Ziel ist es über die composer.json und composer.lock einen Stand von Abhängigkeiten zu definieren, der jederzeit reproduzierbar ist - genau aus dem Grund um nicht 500MB Vendor-Libs einchecken zu müssen.

    Box an sich hat ebenfalls ein Composer-Repo, weshalb du über composer require die lib auch in deinem Projekt installieren kannst.

    Gerne kannst du nochmal grob deinen Aufbau erläutern. (Projekt, Ordnerstruktur, was ist wofür und was ist das Ziel), dann kann man sich das sicher nochmal anschauen.

    VG,
    Acr0most
    Wenn das Leben wirklich nur aus Nullen und Einsen besteht, dann laufen sicherlich genügen Nullen frei herum. :D
    Signature-Move 8o
    kein Problem mit privaten Konversationen zu Thema XY :thumbup:
    Zur Klarstellung, damit hier kein Missversändnis entsteht: Ich möchte lediglich herausfinden, welche PHP-Extensions mein Projekt verwendet, egal wie. D. h. ich möchte weder für mein Projekt Composer verwenden (also die Abhängigkeiten für mein Projekt einstellen) noch geht es explizit darum, irgendwas mit Composer zu installieren (nur wenn es nötig ist, um mein Vorhaben zu erreichen).

    Mein Projekt besteht aus einer Anzahl PHP-Dateien, sowas in der Art:

    Quellcode

    1. /htdocs/
    2. /htdocs/index.php
    3. /htdocs/data.php
    4. /htdocs/includes/
    5. /htdocs/includes/function.php
    6. /htdocs/export/
    7. /htdocs/export/export.php

    Wie ich die Anleitung von "php-compatinfo" verstehe, kann ich damit sagen, ermittle von allen PHP-Dateien in "htdocs" die benötigten Extensions.

    Wenn ich nun "php-compatinfo" via composer installiere, wäre zunächst einmal die Frage, wohin. Ob in "htdocs" oder ganz woanders hin. Habe beides versucht. Habe dann logischerweise meinen "vendor"-Ordner und darin auch irgendwo "[...]/bin/phpcompatinfo". Führe ich diese direkt aus (an der Konsole), hagelt es PHP-Fehlermeldungen ohne Ende.

    Dann gibt es die Alternative mit der Kompilierung einer PHAR-Datei. Gemäß Anleitung in der Doku von "php-compatinfo" geht das, wie ich oben schrieb, über "box". Es gibt von box auch eine PHAR-Datei, die habe ich mir geladen und damit die Kompilierung angestoßen. Aber egal in welchem Verzeichnis ich das mache, es klappt nicht. Es sei denn, ich ändere die Datei "box.json.dist" von php-compatinfo. Das kann aber meiner Meinung nach nicht richtig sein. Selbst wenn ich box via Composer installieren würde, wo wäre der Unterschied? Der Fehler bezieht sich schließlich darauf, dass im php-compatinfo-Verzeichnis irgendwas nicht stimmt.

    Zwar läuft box nach Änderung der genannten JSON-Datei, aber das Kompilat klappt ebenfalls nicht, siehe Fehlermeldung oben.

    Die Kernfrage ist einfach, wie führe ich "php-compatinfo" aus?

    Ach ja, ganz wichtig, ich mache alles unter Windows (10)! Natürlich steht mir auch ein Linux-Server zur Verfügung, aber die Entwicklungsumgebung ist nunmal Windows, daher würde ich auch dort gerne die Extensions ermitteln.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    "Egal wie" impliziert zwar dass Composer auch eine Möglichkeit wäre, aber ich verstehe worauf du hinaus willst.

    Normalerweise gehst du in diesem Umfeld her, nimmst eine entsprechende IDE und wenn du bspw. mit PDO arbeitest wird dir angezeigt dass hierfür die PDO-Extension gebraucht wird. Per Shortcut wird das in die composer.json geschrieben (IntelliJ kann das bspw.). Zur Not musst du dir selbst einen Parser schreiben der anhand der Uses entscheidet welche PHP-Extensions von deinem Projekt gebraucht werden.

    Mit Box hab ich noch nichts gemacht und verstehe auch den Sinn davon (für das Vorhaben hier) nicht.
    Die directories-Fehlermeldung kommt daher dass der relative Pfad nicht matched, die Datei zu ändern halte ich für gängig, ist ja nur eine Konfigurations-Datei - die Entwickler wissen ja nicht wie dein Projekt aufgebaut ist.Die Compile-Exception kommt m.M.n. daher dass entsprechend abhängige Pakete nicht installiert sind.

    Du schreibst du hast schon per Composer php-compactinfo installieren wollen - mit Fehlermeldungen. Welche sind das? Vielleicht bringen die uns weiter.

    VG,
    Acr0most
    Wenn das Leben wirklich nur aus Nullen und Einsen besteht, dann laufen sicherlich genügen Nullen frei herum. :D
    Signature-Move 8o
    kein Problem mit privaten Konversationen zu Thema XY :thumbup:

    Acr0most schrieb:

    "Egal wie" impliziert zwar dass Composer auch eine Möglichkeit wäre

    Ja, das ist durchaus OK.

    Acr0most schrieb:

    nimmst eine entsprechende IDE

    Ich arbeite bisher bei der Webentwicklung (auch bei reinen PHP-Projekten) mit Dreamweaver. Jetzt auf die Schnelle noch eine ganz neue und mir völlig unbekannte IDE suchen und installieren (und erst mal verstehen), ist aus Zeitgründen nicht möglich.

    Acr0most schrieb:

    selbst einen Parser schreiben der anhand der Uses entscheidet welche PHP-Extensions von deinem Projekt gebraucht werden

    Ich wüsste nicht, wie das gehen könnte. Ich importiere nichts explizit, sondern nutze einfach die vorgefertigten PHP-Funktionen. Da gibt's kein "use" o. ä.

    Acr0most schrieb:

    Mit Box hab ich noch nichts gemacht und verstehe auch den Sinn davon (für das Vorhaben hier) nicht.

    Weil ich dann a) nur eine Datei habe statt hunderte und b) sich die Enduser-Doku nur auf die Phar-Version bezieht. Ich habe keine detaillierte Anleitung für die Composer-Variante oder den direkten Download des Repositories gefunden.

    Acr0most schrieb:

    die Datei zu ändern halte ich für gängig

    OK. Ich hielt es allerdings für möglich, dass die Fehlermeldung bei der Ausführung der kompilierten/gepackten Datei damit zusammenhängt, dass er aufgrund meiner Pfadänderung falsche Dateien zusammengestellt hat.

    Acr0most schrieb:

    mit Fehlermeldungen. Welche sind das?

    Nach Ausführung des simpelsten Befehls php phpcompatinfo --version, um nur die Versionsnummer zu erhalten, bekomme ich das hier:

    Spoiler anzeigen

    Quellcode

    1. Fatal error: Uncaught Symfony\Component\Config\Exception\FileLocatorFileNotFoundException: The file "D:\vendor\bartlett\php-compatinfo/vendor/bartlett/php-compatinfo-db/config/set/default.php" does not exist. in D:\vendor\symfony\config\FileLocator.php:44
    2. Stack trace:
    3. #0 D:\vendor\symfony\config\Loader\FileLoader.php(142): Symfony\Component\Config\FileLocator->locate('D:\\...', 'D:\\...', false)
    4. #1 D:\vendor\symfony\config\Loader\FileLoader.php(98): Symfony\Component\Config\Loader\FileLoader->doImport('D:\\...', NULL, false, 'default.php')
    5. #2 D:\vendor\symfony\dependency-injection\Loader\FileLoader.php(66): Symfony\Component\Config\Loader\FileLoader->import('D:\\...', NULL, false, 'default.php')
    6. #3 D:\vendor\symfony\dependency-injection\Loader\Configurator\ContainerConfigurator.php(64): Symfony\Component\DependencyInjection\Loader\FileLoader->import('D:\\...', NULL, false, 'default.php')
    7. #4 D:\vendor\bartlett\php-compatinfo\config\set\default.php(35): Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator->import('D:\\...')
    8. #5 D:\vendor\symfony\dependency-injection\Loader\PhpFileLoader.php(151): Symfony\Component\DependencyInjection\Loader\ProtectedPhpFileLoader::{closure}(Object(Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator))
    9. #6 D:\vendor\symfony\dependency-injection\Loader\PhpFileLoader.php(67): Symfony\Component\DependencyInjection\Loader\PhpFileLoader->executeCallback(Object(Closure), Object(Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator), 'D:\\...')
    10. #7 D:\vendor\bartlett\php-compatinfo\src\Infrastructure\Framework\Symfony\DependencyInjection\ContainerFactory.php(27): Symfony\Component\DependencyInjection\Loader\PhpFileLoader->load('default.php')
    11. #8 D:\vendor\bartlett\php-compatinfo\bin\phpcompatinfo(20): Bartlett\CompatInfo\Infrastructure\Framework\Symfony\DependencyInjection\ContainerFactory->create()
    12. #9 {main}
    13. Next Symfony\Component\Config\Exception\LoaderLoadException: The file "D:\vendor\bartlett\php-compatinfo/vendor/bartlett/php-compatinfo-db/config/set/default.php" does not exist in D:\vendor\bartlett\php-compatinfo/vendor/bartlett/php-compatinfo-db/config/set/default.php (which is being imported from "default.php"). in D:\vendor\symfony\config\Loader\FileLoader.php:174
    14. Stack trace:
    15. #0 D:\vendor\symfony\config\Loader\FileLoader.php(98): Symfony\Component\Config\Loader\FileLoader->doImport('D:\\...', NULL, false, 'default.php')
    16. #1 D:\vendor\symfony\dependency-injection\Loader\FileLoader.php(66): Symfony\Component\Config\Loader\FileLoader->import('D:\\...', NULL, false, 'default.php')
    17. #2 D:\vendor\symfony\dependency-injection\Loader\Configurator\ContainerConfigurator.php(64): Symfony\Component\DependencyInjection\Loader\FileLoader->import('D:\\...', NULL, false, 'default.php')
    18. #3 D:\vendor\bartlett\php-compatinfo\config\set\default.php(35): Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator->import('D:\\...')
    19. #4 D:\vendor\symfony\dependency-injection\Loader\PhpFileLoader.php(151): Symfony\Component\DependencyInjection\Loader\ProtectedPhpFileLoader::{closure}(Object(Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator))
    20. #5 D:\vendor\symfony\dependency-injection\Loader\PhpFileLoader.php(67): Symfony\Component\DependencyInjection\Loader\PhpFileLoader->executeCallback(Object(Closure), Object(Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator), 'D:\\...')
    21. #6 D:\vendor\bartlett\php-compatinfo\src\Infrastructure\Framework\Symfony\DependencyInjection\ContainerFactory.php(27): Symfony\Component\DependencyInjection\Loader\PhpFileLoader->load('default.php')
    22. #7 D:\vendor\bartlett\php-compatinfo\bin\phpcompatinfo(20): Bartlett\CompatInfo\Infrastructure\Framework\Symfony\DependencyInjection\ContainerFactory->create()
    23. #8 {main}
    24. thrown in D:\vendor\symfony\config\Loader\FileLoader.php on line 174

    Die genannte Datei default.php existiert allerdings im genannten Verzeichnis.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Also was mir als erstes auffällt ist "D:\vendor\bartlett\php-compatinfo/vendor/bartlett/php-compatinfo-db/config/set/default.php"

    Kann man unter Windows einen Pfad mit einer Mischung aus Slash und Backslash richtig auflösen? Grad keinen Windowsrechner zur Hand.

    VG,
    Acr0most

    EDIT:

    Marcus Gräfe schrieb:

    Ich wüsste nicht, wie das gehen könnte. Ich importiere nichts explizit, sondern nutze einfach die vorgefertigten PHP-Funktionen. Da gibt's kein "use" o. ä.


    Naja rudimentär (Pseudo-Code):

    Quellcode

    1. IF fileContent.Contains("json_encode"|"json_decode") { gib "ext-pdo" aus }


    Wäre ein recht einfaches Beispiel. Aber wie du wahrscheinlich vermutest, nicht allumfänglich und fehleranfällig.
    Wenn das Leben wirklich nur aus Nullen und Einsen besteht, dann laufen sicherlich genügen Nullen frei herum. :D
    Signature-Move 8o
    kein Problem mit privaten Konversationen zu Thema XY :thumbup:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Acr0most“ ()

    Bzgl. Mix der Slashes: Ja, geht. Habe es soeben mit PHP und im Windows-Explorer getestet. /, \ und eine Mischung geht. Muss auch, denn sonst müsste man für Windows-PHP eine eigene Datei schreiben, weil die Linux-Version anders sein muss.

    Bzgl. des Pseudo-Codes: Das setzt aber voraus, dass ich weiß, welche Funktion in welcher Library ist. Genau diese Info fehlt mir. Klar kann ich mich an der Doku entlang hangeln, aber das dauert ewig, würde ich behaupten. Allerdings arbeitet das oben verlinkte Skript so ähnlich (was mir aber ausgibt, dass keine verwendet werden): github.com/alexverkeenko/php-unused-extensions-scanner
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Hi,

    @Marcus Gräfe also recht schnell geht's, das Projekt bzw. den Ordner mit PhpStorm zu öffnen, dort kannst du dann in den Settings (Ctrl+Alt+S) > Editor > Inspections das Standardprofil duplizieren (oben bei Profile Klick auf's Zahnrad und auf "Duplicate...", kurz umbenennen in "Only extensions" oder was auch immer) und dort dann alle Inspections ausschalten mit Ausnahme von der unter "PHP > Composer > Extension is missing in composer.json".



    Anschließend links im Project Explorer einen Rechtsklick auf den Ordner in dem du suchen willst (most likely der root folder) und dann auf "Inspect Code..." klicken. Der rödelt kurz rum und zeigt dir dann die extensions die nötig wären damit die Software lauffähig ist:




    Grüße
    Link
    Hello World
    Danke, das klingt sehr vielversprechend! Werde das auf jeden Fall ausprobieren. Dazu komme ich allerdings leider erst Ende Januar bzw. Anfang Februar. Ich melde mich dann wieder.

    Da PhpStorm eigentlich kostenpflichtig ist, frage ich mich allerdings, ob dieses Feature in der kostenlosen Demoversion auch aktiviert ist.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Meines Wissens gibt es in der Trial keinerlei Einschränkung. Wenn die 30 Tage abgelaufen sind, kann man PhpStorm afaik weiterhin in 30-Minuten Sitzungen öffnen. Wenn du allerdings sowieso bereits ne aktive Subscription hast und die schon länger als 12 Monate hintereinander aktiv läuft, kriegst du automatisch eine perpetual fallback license, d.h. die PhpStorm Version zum Zeitpunkt des Ablaufs deines Abonnements kannst du beliebig lang kostenlos in vollem Funktionsumfang weiter nutzen. Alternativ registrierst du dir jeden Monat ne neue Mailadresse und fährst für ewig die 30-Tage-Trial-Schiene lul. Als letzte Option kannst du auch einfach die paar Euro hinblättern, jedes Jahr verringert sich ja der Preis, ich zahle zB schon seit 2018 nur noch 6,30€/Monat, is jetzt auch nicht so wild - natürlich nur sinnvoll sofern sich das für dich auch lohnt und die Software entsprechend oft genug im Einsatz ist. Ansonsten ggf. mal rausfinden, was NetBeans oder andere IDEs können, die sind zwar aus meiner Sicht alle Ranz, andererseits nutzen es ja auch einige, einen Versuch kann es also sicherlich wert sein :)

    Grüße
    Link :thumbup:
    Hello World
    @Marcus Gräfe
    Gut da bin ich voreingenommen, arbeite ja quasi 24/7 nur mit PhpStorm, aber wenn sich's für dich nicht lohnt ist es natürlich schwachsinnig, dafür Geld auszugeben, da hast du absolut Recht.

    Btw, habe nochmal geschaut, also um nur die unique extensions anzuzeigen ohne dass man sie sich durch manuelles Aufklappen der ganzen Dateien in der Ergebnisliste erst zusammensuchen muss, gibt's auch noch einen nicen "Trick". Wenn du wie oben beschrieben die Inspection entsprechend über den gesamten Projektfolder hast laufen lassen, kannst du unten in der Ergebnisliste links direkt auf "Extension is missing in composer.json" und dann rechts auf "Fix partially" klicken, siehe Screenshot:




    Grüße
    Link :thumbup:
    Hello World
    @Link Ich habe es nun heute endlich mit PhpStorm getestet und es funktioniert einwandfrei. Vielen Dank! Damit ist das Thema endlich abgeschlossen.

    P. S.: Man benötigt übrigens zwingend einen JetBrains-Account.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Heute klappt es mit PhpStorm übrigens nicht mehr. Selbst nach dem Reset der Konfiguration des gesamten Programms oder Löschen der Projekteinstellungen (Ordner ".idea") will er einfach nichts mehr finden. Habe das Programm auch mehrfach neugestartet. Alle anderen Inspections gehen noch. Es ist auch egal, ob es eine composer.json gibt oder nicht (der Inhalt ist auch egal). "Code inspection did not find anything to report.". Die Lizenz des Programms läuft noch bis zum 2.3., ist also noch nicht abgelaufen. Ich verstehe es nicht ...
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum