automatisch bestand zoeken op server
Hoop dat iemand me kan helpen. Ik wil vanuit index.php een script maken dat automatisch naar een bestand zoekt op een hoger niveau van de server. Laten we dit bestand voor het gemak even test.php noemen.
Wat ik wil is dat als index.php wordt aangeroepen er automatisch gezocht wordt naar test.php en dan eerst op 1 niveau hoger dan waar de index staat. Ik zou dan willen dat op dat hogere niveau alle folders worden gescand of het bestand test.php er in staat. Zo nee, dan moet automatisch een niveau hoger worden gezocht in alle directories. Als daar ook niks wordt gevonden dan moeten de directories in 1 niveau hoger weer worden gescand, net zo lang tot het bestand test.php uiteindelijk is gevonden. Iemand een idee hoe ik dit kan aanpakken? Alvast bedankt!
Gewijzigd op 11/04/2011 15:58:55 door Ozzie PHP
Niemand enig idee, of is mijn vraag niet duidelijk?
Zo ga je dus zoeken op plaatsen waar een gebruiker niet hoort te komen. Ik weet niet wat je van plan bent, maar het lijkt mij niet slim.
>Maak een array met de maps die je hebt in niveaus
>met behulp van een while ga je de hele array af tot je hem hebt gevonden met files_get_contents:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
NOTE: Dit is niet getest, ik ben op school dus heb geen php server en weet dus niet of het werkt. Error report op géén anders krijg je elke keer als je hem niet vind een error :P
Gewijzigd op 14/04/2011 12:17:58 door phpnuke r
Ik zal een beetje proberen uit te leggen wat ik bedoel. Ik wil een framework maken. De bestanden van dit framework wil ik op het beveiligde deel van een server zetten (het gedeelte waar je via de browser niet bij kunt komen). De bestanden van het framework wil ik in een directory "framework" zetten. Afhankelijk van wat voor server het is (prive, shared host, windows, apache) kan de directory "framework" op verschillende locaties komen te staan. Nu wil ik dat vanuit het (publiek toegankelijke) index.php bestand automatisch gezocht wordt naar de directory "framework" die dus ergens op de server staat. De handigste manier lijkt me om vanaf het publieke niveau (httpdocs) 1 niveau omhoog te gaan en daar dan te gaan zoeken naar de directory "framework". Bestaat die directory niet, dan moeten alle andere directories op datzelfde niveau doorzocht worden op de directory "framework". Wordt ook nu de directory "framework" niet gevonden, dan moet er weer 1 niveau hoger gezocht worden enz.
Stel dat het bestand index.php zich op de onderstaande locatie bevindt:
server/mijnsite/httpdocs/index.php
De directory "framework" zou zich dan bijvoorbeeld op de 3 volgende locaties kunnen bevinden:
server/mijnsite/private/framework
of
server/mijnsite/framework
of
server/framework
In al deze gevallen moet index.php de directory "framework" automatisch kunnen zoeken.
Is het zo duidelijk wat ik bedoel? Alvast bedankt voor de hulp!
Gewijzigd op 14/04/2011 12:40:13 door Ozzie PHP
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
$array = array();
$array[1] = './framework';
$array[2] = '../framework';
$array[3] = '../../framework';
$current = 1;
$end = 0;
while($end==0)
{
$search = file_get_contents($array[$current].'/test.php');
if(!$search==null)
{
echo "test.php staat in ".$array[$current];
$end = 1;
}
else
{
$current++;
}
}
?>
$array = array();
$array[1] = './framework';
$array[2] = '../framework';
$array[3] = '../../framework';
$current = 1;
$end = 0;
while($end==0)
{
$search = file_get_contents($array[$current].'/test.php');
if(!$search==null)
{
echo "test.php staat in ".$array[$current];
$end = 1;
}
else
{
$current++;
}
}
?>
Of je zou in de while telkens automatisch ../ aan een variable kunnen toevoegen, dus zo:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
$root = 'framework';
$limit = 0;
$end = 0;
while($end==0)
{
$search = file_get_contents($root.'/test.php');
if(!$search==null)
{
echo "test.php staat in ".$array[$current];
$end = 1;
}
else
{
if($limit==3) //Maximale hoogte
{
echo "File test.php not found";
$end = 1;
}
else
{
$root = '../'.$root; //Zoals je zei een stapje hoger
$limit++;
}
}
}
?>
$root = 'framework';
$limit = 0;
$end = 0;
while($end==0)
{
$search = file_get_contents($root.'/test.php');
if(!$search==null)
{
echo "test.php staat in ".$array[$current];
$end = 1;
}
else
{
if($limit==3) //Maximale hoogte
{
echo "File test.php not found";
$end = 1;
}
else
{
$root = '../'.$root; //Zoals je zei een stapje hoger
$limit++;
}
}
}
?>
Mijn codes zijn rechtstreeks gemaakt, fouten zitten er hoogstwaarschijnlijk in of nietwerkende stukjes!
Gewijzigd op 14/04/2011 14:10:06 door phpnuke r
Alleen hoe moet ik al die directories doorzoeken vraag ik me af... :-S
Mja... ik ga er nog wel ff mee aan de slag...
Als het goed is gaat deze alleen naar beneden, right? Exact zoals je zei, als hij dieper moet gewoon limit in if($limit==3) veranderen. Of moet er meer gebeuren?
Nee, dit is zo ongeveer wel wat het moet doen. Alleen zou het dus kunnen zijn dat "framework" niet in de root staat maar in een andere directory. Als ie 'm in de root niet kan vinden, dan moet ie (de roots van) de directories gaan doorzoeken. Dat doet ie nu nog niet...
$array[1] = './framework';
$array[2] = '../framework';
$array[3] = '../../framework';
$array[4] = '../forum/framework';
$array[5] = '../blog/framework';
Hoewel ik denk dat je beter gewoon de framework directr kunt opnemen zodner dit hele script, ik bedoel waarom moet hij opgezocht worden?(just an tip)
OH: Het script heeft nog geen limiet, als array5 ook niks heeft zal de script zich vast laten lopen, please use a limit :P
Het "probleem" is dat bijvoorbeeld op een windows server met plesk je de prive bestanden in de map "private" moet zetten. Je kunt daar niet zomaar een directory aanmaken. Ik weet van tevoren dus niet exact waar ik het framework moet plaatsen. Daarom wil ik het systeem er automatisch naar laten zoeken. Ik wil niet hardcoded mapnamen gaan opgeven omdat dit per server kan verschillen.
Daar weet ik niks van maar je zou dus alle mogelijke roots in een array kunnen zetten, en anders is er denk ik niet echt een optie :(
Nee, ik denk dat het wel anders kan... door per niveau (root) de directories op te halen. Weet nog niet hoe, maar ik ga het proberen uit te vinden...
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$dispatch = Dispatcher::getInstance($customer);
$user = $dispatch->get('User');
?>
$dispatch = Dispatcher::getInstance($customer);
$user = $dispatch->get('User');
?>
Ik wil dus de class "User"
In mijn Dispatcher class heb ik dan ergens de volgende methode
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
public static function get($class) {
// Set up class url
$basepath = $class.'.php';
// Include base class
include('core/'.$basepath);
// Do we have custom functionality
$custom_url = 'custom/'.self::$customer_slug.'/'.$basepath;
if (file_exists($custom_url)) {
include($custom_url);
$classname = self::$customer_slug.'_'.$class;
return new $classname;
} else {
return new $class;
}
}
?>
public static function get($class) {
// Set up class url
$basepath = $class.'.php';
// Include base class
include('core/'.$basepath);
// Do we have custom functionality
$custom_url = 'custom/'.self::$customer_slug.'/'.$basepath;
if (file_exists($custom_url)) {
include($custom_url);
$classname = self::$customer_slug.'_'.$class;
return new $classname;
} else {
return new $class;
}
}
?>
De bestanden structuur ziet er dan ongeveer zo uit:
/core
-/User.php (class User)
/custom
-/sony
--/User.php (class sony_User extends User)
Dus iets minder diep dan dat jij wilt.
Wat ik nu dus kan, is kijken of er voor de klant 'sony' (is ook de customer_slug) een User.php bestand aanwezig is en dan die gebruiken. Deze extend ook de core User class, dus ik hoef alleen per klant aan te passen.. Als dat allemaal niet nodig is, gebruik ik gewoon core/User.php.
In de variable $user heb ik dus een sony_User of User class, en kan ik dus aanroepen wat ik wil, ongeacht wat hun functionaliteit is (soort van).
Dit is inderdaad iets anders dan hetgeen ik wil, maar toch bedankt :)
finder van symfony kijken en deze misschien uitbreiden.
Je kan eens naar de thanks... maar dit hoeft niet met classes... ik moet gewoon een stukje simpele code hebben die telkens 1 niveau hoger gaat en daar de directories afspeurt... ik gebruik het om vanuit de index.php eenmalig het framework op te sporen op een hoger niveau op de server.
Ik denk dat er geen andere optie is dan onze stukjes code te gebruiken of dit stukje gewoon te cancelen.
Ik zou overigens wel niet telkens op zoek gaan. Je zou zoiets kunnen inbouwen in je installer, die dat dan opslaat als een constante. define('PATH', $script) Op die manier maak je weer een tikkeltje performance winst.
Ik had zelf bedacht om het pad van het framework op te slaan in een .ini bestandje. Dus de allereerste keer laten zoeken en dan wegschrijven in een ini bestand. En dan bij iedere pagina aanroep het ini bestandje even inlezen.