Σφάλματα #127
Γραμμή Μάθησης - Εργασίες: include error
20%
Description
Κατά την εμφάνιση άσκησης που έχει προστεθεί στη γραμμή μάθησης, εμφανίζεται:
Warning: require_once(../../include/log.php): failed to open stream: No such file or directory in /var/www/eclass/modules/exercise/exercise.class.php on line 22
Fatal error: require_once(): Failed opening required '../../include/log.php' (include_path='.:/usr/share/php5:/usr/share/php') in /var/www/eclass/modules/exercise/exercise.class.php on line 22
Associated revisions
Revision 14982:b3595386f835
(diff)
temporary bugfix exercise class include log (refs #127)
History
Updated by Yury Kherimyan almost 11 years ago
Δεν φτάνει στο ίδιο επίπεδο με το include, θέλει να πάει άλλο ένα επίπεδο πάνω, δλδ modules/exercise/exercise.class.php on line 22:require_once '../../include/log.php'
=>require_once '../../../include/log.php'
Αν και δεν θα ήταν σωστότερο να χρησιμοποιηθεί κάτι σαν τη μεταβλητή$webDir = 'S:/WorkSpace/openeclass/';
και να γίνειrequire_once $webDir.'include/log.php'
Updated by Yury Kherimyan almost 11 years ago
Έψαξα λίγο και είδα πως εξαρχής ήταν γραμμένο έτσι και εξαρχής ο φάκελος include ήταν στη θέση που είναι και τώρα,
οπότε στο ερώτημα του γιατί δεν είχε σκάσει μέχρι τώρα μπορώ μονάχα να κάνω την εικασία πως:
- Γινόταν include το log.php από άλλη τοποθεσία (με σωστό path) και επειδή ήταν σε require_once δεν πήγαινε όντως
να το κάνει include και το προσπερνούσε. Στην γραμμή μάθησης όμως μάλλον δεν το ζητάμε κάπου νωρίτερα οπότε
πάει όντως να το κάνει include με το λάθος path και σκάει (μιας και είναι require κ όχι απλό include)
Updated by Yury Kherimyan almost 11 years ago
Εικασία 2η (νομίζω πιο σωστή):
Σύμφωνα με αυτό [[http://stackoverflow.com/questions/2253625/php-require-once-not-working-the-way-i-want-it-to-relative-path-issue]],
όταν γίνει nested require(_once) and include(_once), θα δουλέψουν όλα με τη σχετική διαδρομή του αρχικού αρχείου που τα κάλεσε. Εικάζω πως σε άλλες
περιπτώσεις το modules/exercise/exercise.class.php καλείται από βάθος 2 (δλδ: modules/something ή main/something etc). Στην περίπτωση όμως
του learning path καλείται από βάθος 3, συγκεκριμένα από το modules/learnPath/navigation, οπότε το ../../ δεν του αρκεί και καταλήγει να πηγαίνει
στο φάκελο modules/include.
Επομένως η λύση με το ../../ να γίνει ../../../ λύνει το πρόβλημα στο learning path,
αλλά μπορεί (δεν είδα ακόμα) να χαλάει το require των logs σε κάποιο άλλο σημείο.
Οπότε προτείνω να γίνει:require_once __DIR__.'/../../include/log.php';
Updated by Thanos Kyritsis almost 11 years ago
Για να σε γλιτώσω και από τον κόπο του ψαξίματος, στο συγκεκριμένο κομμάτι των includes/requires θα κάνουμε την κατάλληλη βελτίωση ώστε να μην χρειάζονται καθόλου τα relative paths, να γίνουν όλα δηλαδή require_once('include/log.php'); ανεξαρτήτως βάθους directory, οπότε να σταματήσουν και στο μέλλον όλα τα σχετικά bugs. Απλώς ανοίξαμε και το bug για να μας θυμίζει την εκρεμμότητα :-)
Updated by Thanos Kyritsis almost 11 years ago
- % Done changed from 0 to 20
Έστειλα ένα προσωρινό πρόχειρο patch, για να μην σκάει με error, που κάνει file_exists και τσεκάρει αν πρέπει να βάλει 3 directories πάνω ή 2.
Ας αφήσουμε ανοιχτό το issue. Η πραγματική λύση θα δοθεί όταν χρησιμοποιήσουμε την set_include_path(), αλλά ας προχωρήσει το development προς το παρόν και το κοιτάμε.
temporary bugfix exercise class include log (refs #127)