PHP Programmierer gesucht [$$$ inside]

    • masterfu
      masterfu
      Bronze
      Dabei seit: 05.12.2006 Beiträge: 4.895
      suche einen PHP Programmierer, der mir folgenden Linkchecker rekursiv bastelt.
      Das ganze muss mit der url http://www.cash-daddy.de funktionieren.

      als ergebniss brauch in ein array wo alle projektinternen URLs drin sind. es müssen keine externen links geprüft werden.

      50$ auf stars. brauche es bis heute abend. wenn ich mehr zeit gebe und derjenige es doch nicht schafft kommt mein zeitrahmen ins schwanken.

      kontakt per icq 178801668

      achso, falls sich jmd fragt warum ichs nicht selber tue: ich hatte ihn rekursiv, nur verleif er sich ;D /kategorien/kategorien/kategorien/kategorien/ war irgendwie falsch ;) und ich hab einfach nicht die zeit jetzt. muss auch noch 3 jahre berichtsheft schreiben

      anbei der linkchecker.
      code:
      <?php
      		
      		
      		
      		
      /* show all errors */
      error_reporting(E_ALL);
      
      /* defines the line-feed to be used */
      define( 'LF', "\r\n" );
      
      /* set time limit to 0 because it can take a long time to check all the links on a page */
      set_time_limit (0);
      
      /* allows link checker to show what a code means */
      $status_codes = array(
      	'404' => 'Not Found - Link doesn\'t exist',
      	'500' => 'Internel Server Error - Failed to show page because server had an error',
      	'200' => 'OK - Link is fine'
      );
      
      /* define the three status codes colours */
      define( 'status_colour_red', 'ff6666' );
      define( 'status_colour_amber', 'ffcc66' );
      define( 'status_colour_green', '66ff99' );
      
      /* key to which status code is which colour */
      $status_colour = array(
      	'404' => status_colour_red,
      	'500' => status_colour_amber,
      	'200' => status_colour_green
      );
      
      
      /**
       * Extracts links from html
       *
       * @param $html The HTML to extract links from
       * @param $url The URL the HTML came from (used to make absolute links)
       * @return array All the links that were extracted
       */
      function get_links( $html, $url )
      {
          $links    = array();
          $url_info = parse_url( $url );
      
          preg_match_all( "/<a[\s]+[^>]*?href[\s]?=[\s\"\']+(.*?)[\"\']+.*?>/", $html, $matches );
      
          if( empty( $url_info['path'] ) )
              $url_info['path'] = '/';
      
          /* if there is a file at the end of the url get it */
          if( $url_info['path']{strlen( $url_info['path'] ) - 1} != '/' )
              $url_info['path'] = substr( $url_info['path'], 0, strrpos( $url_info['path'], '/' ) + 1 );
      
          if( substr( $url_info['host'], 0, 4 ) == 'www.' )
              $host = substr( $url_info['host'], 4 ) . '/';
          else
              $host = $url_info['host'];
      
          for( $i=0; isset( $matches[1][$i] ); $i++ )
          {
              if( $matches[1][$i]{0} != '#' && ! strpos( $matches[1][$i], '@' ) ) // stop #top sort of links and remove emails
              {
      
                  if( strpos( $matches[1][$i], '#' ) )
                      $matches[1][$i] = substr( $matches[1][$i], 0, strpos( $matches[1][$i], '#' ) );
      
                  if( $matches[1][$i]{0} == '/' ) // add host to any links
                      $links[] = $url_info['scheme'] . '://' . $url_info['host'] . $matches[1][$i];
                  elseif( $matches[1][$i]{0} == '.' )
                  {
                      $done    = true;
                      $url     = $matches[1][$i];
                      $cur_dir = explode( '/', $url_info['path'] );
                      array_shift($cur_dir );
                      array_pop($cur_dir );
      
                      for( $j=0; isset( $cur_dir[$j] ); $j++ )
                          $cur_dir[$j] = '/' . $cur_dir[$j];
      
                      for(;$done;)
                      {
                          /*  if no more ./ or ../ then it's done */
                          if( $url{0} != '.' )
                          {
                              $links[] = $url_info['scheme'] . '://' . $url_info['host'] . implode( '', $cur_dir ) . '/' . $url;
                              $done    = false;
                          }
                          /* remove same dir as that is the default */
                          elseif( substr( $url, 0, 2 ) == './' )
                              $url = substr( $url, 2 );
                          else
                          {
                              $url = substr( $url, 3 );
                              array_pop( $cur_dir );
                          }
                      }
                  }
                  elseif( substr( $matches[1][$i] , 0, 7 ) != 'http://' && substr( $matches[1][$i] , 0, 8 ) != 'https://' ) // do any links left without root
                      $links[] = $url_info['scheme'] . '://' . $url_info['host'] . $url_info['path'] . $matches[1][$i];
                  else
                  {
      				$links[] = $matches[1][$i];
                  }
              }
          }
      
          return $links;
      }
      
      
      /**
       * PHP get
       *
       * @param $url The url to get
       * @return mixed string contents or false
       */
      function php_get( $url )
      {
      	$contents = '';
      
      	ini_set( 'user_agent', 'User-Agent: FPLinkChecker/1.2' );
      	if( ( $fp = fopen( $url, 'r' ) ) )
      	{
      		for( ;($data = fread( $fp, 1024 ) ); )
      			$contents .= $data;
      
      		fclose( $fp );
      	}
      	elseif( function_exists( 'curl_init' ) )
      	{
      		$ch = curl_init( );
      
      		curl_setopt( $ch, CURLOPT_URL, $url );
      		curl_setopt( $ch, CURLOPT_HEADER, 0 );
      		curl_setopt( $ch, CURLOPT_USERAGENT, 'User-Agent: FPLinkChecker/1.2' );
      		curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
      
      		$contents .= curl_exec( $ch );
      
      		curl_close( $ch );
      	}
      	elseif( ( $url_info = parse_url( $url ) ) )
      	{
      		if( $url_info['scheme'] == 'https' )
      			$fp = fsockopen( 'ssl://' . $url_info['host'], 443, $errno, $errstr, 30);
      		else
      			$fp = fsockopen( $url_info['host'], 80, $errno, $errstr, 30);
      
      		if( !$fp )
      			return false;
      
      		$out = 'GET ' . (isset($url_info['path'])? $url_info['path']: '/') .
      			(isset($url_info['query'])? '?' . $url_info['query']: '') .
      			" HTTP/1.0\r\n";
      		$out .= "Host: {$url_info['host']}\r\n";
      		$out .= "User-Agent: FPLinkChecker/1.2\r\n";
      		$out .= "Connection: Close\r\n\r\n";
      
      		fwrite($fp, $out);
      		for( ;!feof( $fp ); )
      			$contents .= fgets($fp, 128);
      
      		list($headers, $content) = explode( "\r\n\r\n", $contents, 2 );
      
      		return $content;
      	}
      	else
      		return false;
      
      	return $contents;
      }
      
      
      /**
       * PHP get headers
       *
       * @param $url The url to get the headers of
       * @return mixed string headers or false
       */
      function get_headders( $url )
      {
      	$headers = '';
      
      	if( function_exists( 'curl_init' ) )
      	{
      		$ch = curl_init( );
      
      		curl_setopt( $ch, CURLOPT_URL, $url );
      		curl_setopt( $ch, CURLOPT_HEADER, false );
      		curl_setopt( $ch, CURLOPT_NOBODY, true );
      		curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, false );
      		curl_setopt( $ch, CURLOPT_USERAGENT, 'User-Agent: FPLinkChecker/1.2' );
      		curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
      
      		$headers = curl_exec( $ch );
      
      		curl_close( $ch );
      	}
      	elseif( ( $url_info = parse_url( $url ) ) )
      	{
      		if( $url_info['scheme'] == 'https' )
      			$fp = fsockopen( 'ssl://' . $url_info['host'], 443, $errno, $errstr, 30);
      		else
      			$fp = fsockopen( $url_info['host'], 80, $errno, $errstr, 30);
      
      		if( !$fp )
      			return false;
      
      		$out = 'HEAD ' . (isset($url_info['path'])? $url_info['path']: '/') .
      			(isset($url_info['query'])? '?' . $url_info['query']: '') .
      			" HTTP/1.0\r\n";
      		$out .= "Host: {$url_info['host']}\r\n";
      		$out .= "User-Agent: FPLinkChecker/1.2\r\n";
      		$out .= "Connection: Close\r\n\r\n";
      
      		fwrite($fp, $out);
      		for( ;!feof( $fp ); )
      			$contents .= fgets($fp, 128);
      
      		list($headers, $content) = explode( "\r\n\r\n", $contents, 2 );
      		$headers = explode( "\r\n", $headers );
      
      		return $headers;
      	}
      	else
      		return false;
      
      	return $headers;
      }
      
      
      /**
       * Get statuscode
       *
       * @param $headers An array of headers
       * @return array
       */
       function get_statuscode( $headers )
      {
      	for( $i=0;isset( $headers[$i] );$i++ )
      	{
      		// Checks if the header is the status header
      		if( preg_match( "/HTTP\/[0-9A-Za-z +]/i" ,$headers[$i] ) )
      		{
      			// If it is save the status
      			$status = preg_match( "/http\/[0-9]\.[0-9] (.*) (.*)/i", $headers[$i], $matches );
      		}
      	}
      
      	return array( $matches[1], $matches[2] );
      }
      
      function format_result( $link, $known, $bgcol, $result )
      {
      	echo '<div class="linkchecker-result" style="background-color:#' . $bgcol . '">' . LF;
      	echo '<h3><a href="' . $link . '">' . $link . '</a></h3>' . LF;
      	echo '<p>Known: ' . $known . ' Result: ' . $result . '</p>' . LF;
      	echo '</div>' . LF;
      }
      
      function get_status_colour( $status )
      {
      	global $status_colour;
      
      	if( isset( $status_colour[ $status ] ) )
      		return $status_colour[ $status ];
      
      	if( $status > 200 && $status < 300 )
      		return status_colour_green;
      
      	if( $status > 400 && $status < 500 )
      		return status_colour_red;
      
      	return status_colour_green;
      }
      
      function get_status_description( $status, $just_say_if_known = false )
      {
      	global $status_codes;
      
      	if( $just_say_if_known )
      	{
      		if( isset( $status_codes[$status[0]] ) )
      			return 'Yes';
      
      		return 'No';
      	}
      
      	if( isset( $status_codes[$status[0]] ) )
      		return '<acronym title="' . $status_codes[$status[0]] . '">' . $status[0] . '</acronym>';
      
      	return '<acronym title="' . $status[1] . '">' . $status[0] . '</acronym>';
      }
      
      
      if( isset( $_GET['url'] ) )
      {
      	/* for ob_flush to work */
      	if( ob_get_length() === false )
      	    ob_start();
      
      	$html = php_get( $_GET['url'] );
      
      	if( !$html )
      		echo '<p>The <acronym title="Uniform Resource Locator">URL</acronym> you entered appears not to exist.</p>' . LF;
      	else
      	{
      		$links = get_links( $html, $_GET['url'] );
      		unset( $html );
      
      		echo '<p>Getting HTML from <a href="' . $_GET['url'] . '">' . $_GET['url'] . '</a></p>' . LF;
      
      		if( empty( $links ) )
      			echo '<p>The <acronym title="Uniform Resource Locator">URL</acronym> you entered appears not to have any links.</p>' . LF;
      		else
      		{
      			$links         = array_values( array_unique( $links ) );
      			$missing_links = 0;
      			$check_links   = 0;
      			$good_links    = 0;
      
      			echo '<p>Found ' . count( $links ) . ' on <a href="' . $_GET['url'] . '">' . $_GET['url'] . '</a></p>' . LF;
      
      			flush();
      			ob_flush();
      
      			for( $i=0; isset( $links[$i] ) && !connection_aborted( ); ++$i )
      			{
      				/* give server a break after checking each url for half a sec */
      				usleep( 500000 );
      				$headers = get_headers( html_entity_decode( $links[$i] ) );
      
      				if( $headers == false )
      					format_result( $links[$i], 'No', status_colour_red, 'Appears not to exist' );
      
      				$status  = get_statuscode( $headers );
      
      				switch( get_status_colour( $status[0] ) )
      				{
      					case status_colour_red:
      						$missing_links++;
      						break;
      					case status_colour_green:
      						$good_links++;
      						break;
      					default:
      						$check_links++;
      						break;
      				}
      
      				format_result( $links[$i], get_status_description( $status, true ), get_status_colour( $status[0] ), get_status_description( $status ) );
      
      				flush();
      				ob_flush();
      			}
      
      			echo '<p id="linkchecker-linkstats">Found ' . $missing_links . ' dead or missing links.<br />' . LF;
      			echo 'Found ' . $check_links . ' links which need to be checked.<br />' . LF;
      			echo 'Pound ' . $good_links . ' links which are active and fine.</p>' . LF;
      		}
      	}
      }
      else
      {
      	echo '<p>This is a simple link checker to help you find any dead links on your webpages.' . LF;
      	echo 'Just enter the <acronym title="Uniform Resource Locator">URL</acronym> you want to check for' . LF;
      	echo 'dead links on and click <span style="font-weight: bold">Check Links</span></p>' . LF;
      	echo '<form action="' . $_SERVER['PHP_SELF'] . '" method="get">' . LF;
      	echo '<p><label for="url"><acronym title="Uniform Resource Locator">URL</acronym>:</label>' . LF;
      	echo '<input type="text" name="url" id="url" value="http://" size="40" /></p>' . LF;
      	echo '<p><input type="submit" style="font-weight: bold" value="Check links" /></p>' . LF;
      	echo '</form>' . LF;
      }
      
      
      ?>
  • 20 Antworten
    • Bonner83
      Bonner83
      Bronze
      Dabei seit: 09.07.2006 Beiträge: 2.206
      Das Zeitmanagement könnt von mir sein. Ich behaupte mal für 50 $ macht das keiner. Was wär denn das für ein Stundenlohn?
    • masterfu
      masterfu
      Bronze
      Dabei seit: 05.12.2006 Beiträge: 4.895
      stundenlohn von 100$ bis 15$

      je nachdem wie schnell er ist
    • flashfy
      flashfy
      Bronze
      Dabei seit: 25.03.2006 Beiträge: 5.240
      Gut, dass du deinen vollen Namen plus Stadt reinschreibst mit der Intention zu betruegen.
    • taschenbillard
      taschenbillard
      Bronze
      Dabei seit: 08.10.2007 Beiträge: 1.452
      ich hoffe das mit dem skype namen is ein lvl; du warst doch auch der, der hier behauptet hat, dieser namensvetter zu sein.

      1.) falls das alles stimmt -> fail & ich hoffe, du fällst durch.
      2.) falls das alles von dir hier erfunden war -> s. Pkt. 1
    • masterfu
      masterfu
      Bronze
      Dabei seit: 05.12.2006 Beiträge: 4.895
      Original von taschenbillard
      ich hoffe das mit dem skype namen is ein lvl; du warst doch auch der, der hier behauptet hat, dieser namensvetter zu sein.

      1.) falls das alles stimmt -> fail & ich hoffe, du fällst durch.
      2.) falls das alles von dir hier erfunden war -> s. Pkt. 1
      ich habs nicht nur behauptet, ich bins sogar. kannst ja bei der oben angegebenen webseite mal ins impressum schauen.
    • elbarto132
      elbarto132
      Bronze
      Dabei seit: 24.03.2008 Beiträge: 4.622
      lol, php is doch so scheisse :D
      300 zeilen blabla
      schreibs in python, da brauch man dafür 10-20 zeilen
    • masterfu
      masterfu
      Bronze
      Dabei seit: 05.12.2006 Beiträge: 4.895
      Original von elbarto132
      lol, php is doch so scheisse :D
      300 zeilen blabla
      schreibs in python, da brauch man dafür 10-20 zeilen
      gerücht, dass du DAS in 20zeilen python schreibst ;)

      und in ruby in 4 zeilen oder wie?
    • taschenbillard
      taschenbillard
      Bronze
      Dabei seit: 08.10.2007 Beiträge: 1.452
      Original von masterfu
      Original von taschenbillard
      ich hoffe das mit dem skype namen is ein lvl; du warst doch auch der, der hier behauptet hat, dieser namensvetter zu sein.

      1.) falls das alles stimmt -> fail & ich hoffe, du fällst durch.
      2.) falls das alles von dir hier erfunden war -> s. Pkt. 1
      ich habs nicht nur behauptet, ich bins sogar. kannst ja bei der oben angegebenen webseite mal ins impressum schauen.
      HEY, SEI STOLZ AUF DICH! :rolleyes:
      krieg mal lieber dein leben auf die reihe
    • masterfu
      masterfu
      Bronze
      Dabei seit: 05.12.2006 Beiträge: 4.895
      ich bin dabei....
      hatte hier auch mal nen etwas längeren text zu der situatio verfasst.
      aber eins sag ich dir, ende des jahres wirst du noch viel von mir hören ;)
    • rook
      rook
      Bronze
      Dabei seit: 07.05.2006 Beiträge: 250
      Original von elbarto132
      lol, php is doch so scheisse :D
      300 zeilen blabla
      schreibs in python, da brauch man dafür 10-20 zeilen
      Das liegt aber nicht an PHP sondern am Verfasser des Scripts.
      In fast keiner Skriptsprache braucht's dafür mehr als 30 Zeilen...
    • NoBoGeR
      NoBoGeR
      Bronze
      Dabei seit: 13.03.2007 Beiträge: 3.401
      gehört die seite dir?

      dieser affe ist mal lustig und richtig schlecht^^

      aber es gibt bessere angebote im netz...
    • masterfu
      masterfu
      Bronze
      Dabei seit: 05.12.2006 Beiträge: 4.895
      jau, meine seite.

      der bär (kein affe), sollte Mr T darstellen ;) neues design ist aber schon in auftrag.

      wenn du woanders bessere angebote findest, lass dich bitte nicht aufhalten. nur findest du dort keine 3 referalstufen ;-)
    • mickjaeger
      mickjaeger
      Bronze
      Dabei seit: 21.10.2008 Beiträge: 127
      Original von masterfu
      und in ruby in 4 zeilen oder wie?
      Hehehe ... du hasts erfasst!

      @OP:

      Hat PHP nicht mittlerweile auch OOP?

      Das was du vorhast _muss_ doch irgendwie smoother gehn ... vielleicht paar mehr RegExps und bischen bessere Code-Planung - sieht mir auf den ersten Blick schon nach 2-3 Arbeitsstunden aus, um überhaupt durch deine Codebase durchzusteigen. Und dann da iiirgendwo in dem rumgewurschtel nen Bug zu finden, na lecker ... ab 200€/h würd ich's mir antun ;)

      Noch n Tipp: stell ma deine IDE auf Whitespaces statt Tabs um, siehst ja was mit deinem Code passiert, wennde ihn woanders hinpastest mit Tabs drin ...
    • masterfu
      masterfu
      Bronze
      Dabei seit: 05.12.2006 Beiträge: 4.895
      das ist der FPLinkchecker, nicht mein code ;)
    • Bonner83
      Bonner83
      Bronze
      Dabei seit: 09.07.2006 Beiträge: 2.206
      und, jmd gefunden?
    • masterfu
      masterfu
      Bronze
      Dabei seit: 05.12.2006 Beiträge: 4.895
      noez.

      gotta shoot myself
    • sarc
      sarc
      Moderator
      Moderator
      Dabei seit: 06.06.2008 Beiträge: 12.193
      Fast 400 Zeilen? Ernsthaft? WTF??

      PHP is ewig her, aber ich behaupte mal, in Perl kriegt man das in den hier angesprochenen 20 Zeilen locker hin. 1-2 um die URL zu öffnen und den kompletten Inhalt einzulesen. Dann noch schnell den Regex drüber, der Links ausliest. Von mir aus noch n zweiter Regex, wenn absolute und relative URLs gefunden werden müssen. Das alles in n Array packen, Array rekursiv abarbeiten, fertig. Die restlichen 10 Zeilen bleiben dann, um doppelte Seiten zu verhindern. Auch das dürfte nicht unbedingt schwer werden, solangs nicht performant gehen muss...

      Na ja, viel Spaß auf jeden Fall, PHP fass ich freiwillig nicht mehr an...
    • klausschreiber
      klausschreiber
      Bronze
      Dabei seit: 30.07.2006 Beiträge: 5.773
      falls es bis zum Nachmittag keiner hat, kann ich vielleicht mal schauen, jetzt geh ich aber erstmal pennen
    • crt32
      crt32
      Bronze
      Dabei seit: 17.02.2007 Beiträge: 15.895
      Da, hastes rekursiv. Die funktionen get_http und extract_links musst dir halt selbst basteln.
      code:
      $deadlinks = array();
      $checkedlinks = array();
      
      function checklinks($url)
      {
          $content = get_http($url);
          if (is_null($content))
          {
              $deadlinks[] = $url;
          }
          else
          {
              $checkedlinks[] = $url;
              $links = extract_links($content);
              foreach ($links as $link)
              {
                  if (!in_array($link,$deadlinks) && !in_array($link,$checkedlinks))
                  {
                      checklinks($link);
                  }
              }
          }
      }
      
      
    • 1
    • 2