Os dígitos verificadores de CPF seguem uma lógica muito simples. Irei mostrar aqui como verificar se um CPF dado é válido ou até criar  um, em vista que a única parte que deve ser 'levada em conta' são os dígitos verificadores.

O CPF funciona assim: Separe os 9 dígitos principais (retire os dígitos verificadores). Pegue o primeiro dígito e multiplique por 10. Pegue o segundo dígito e multiplique por 9. Pegue o terceiro dígito e multiplique por 8. E assim por diante... Até pegar o nono dígito e multiplicar por 2. Some o resultado obtido e divida por 11. Se o resto da divisão for menor que 2, o primeiro dígito verificador é 0, caso contrário, o primeiro dígito verificador é igual a 11 menos o resto obtido.

A obtenção do segundo dígito é bem simples também: Pegue os 10 dígitos que você já tem (9 do CPF sem os dígitos verificadores e o dígito verificador que conseguiu no primeiro passo) e faça assim: Multiplique o primeiro número por 11 (fique atento à essa mudança!). Multiplique o segundo número por 10. Multiplique o terceiro número por 9. E assim por diante... Até multiplicar o décimo dígito por 2.

Some o resultado obtido, divida por 11 e pegue o resto da divisão. Se ele for menor que 2, o segundo dígito é 0, se não, o segundo dígito é igual a 11 menos o resto obtido agora.

Depois que você calculou o dígito verificador CORRETO do CPF colocado, verifique se os dígitos verificadores corretos batem com os dígitos do usuário. Se sim, retorne verdade, se não, retorne falso.

Agora em PHP! Prontinho pra você:

<?php
function verifyCPF( $cpf )
{
$cpf = "$cpf";
if (strpos($cpf, "-") !== false)
{
$cpf = str_replace("-", "", $cpf);
}
if (strpos($cpf, ".") !== false)
{
$cpf = str_replace(".", "", $cpf);
}
$sum = 0;
$cpf = str_split( $cpf );
$cpftrueverifier = array();
$cpfnumbers = array_splice( $cpf , 0, 9 );
$cpfdefault = array(10, 9, 8, 7, 6, 5, 4, 3, 2);
for ( $i = 0; $i <= 8; $i++ )
{
$sum += $cpfnumbers[$i]*$cpfdefault[$i];
}
$sumresult = $sum % 11;
if ( $sumresult < 2 )
{
$cpftrueverifier[0] = 0;
}
else
{
$cpftrueverifier[0] = 11-$sumresult;
}
$sum = 0;
$cpfdefault = array(11, 10, 9, 8, 7, 6, 5, 4, 3, 2);
$cpfnumbers[9] = $cpftrueverifier[0];
for ( $i = 0; $i <= 9; $i++ )
{
$sum += $cpfnumbers[$i]*$cpfdefault[$i];
}
$sumresult = $sum % 11;
if ( $sumresult < 2 )
{
$cpftrueverifier[1] = 0;
}
else
{
$cpftrueverifier[1] = 11 - $sumresult;
}
$returner = false;
if ( $cpf == $cpftrueverifier )
{
$returner = true;
}


$cpfver = array_merge($cpfnumbers, $cpf);

if ( count(array_unique($cpfver)) == 1 || $cpfver == array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0) )

{

$returner = false;

}
return $returner;
}
?>

Espero que ajude! É uma função com finalidade didática, tem como otimizar muita coisa aí ainda.